スポンサーリンク
バージョン
Flutter:2.0.3
Dart:2.12.2
※筆者はMacで動かしています
プロジェクトを編集するには
プロジェクトを作成したらFinderで「作成したプロジェクト > lib > main.dart」を探してみてください
この「main.dart」を編集することで、プロジェクト(アプリ)の挙動を変えることができます
プロジェクトを作成すると、最初からいろんなフォルダが作られているので、
最初はどこをいじればいいのか全然わかりませんでした笑
main.dartの中身
とりあえず、プロジェクト作成直後の「main.dart」の中身をコピペしたものを置いておきます
(今後の説明のために一部番号をふっています)
//Part1 import 'package:flutter/material.dart'; //Part2 void main() { runApp(MyApp()); } //Part3 class MyApp extends StatelessWidget { // This widget is the root of your application. @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', theme: ThemeData( // This is the theme of your application. // // Try running your application with "flutter run". You'll see the // application has a blue toolbar. Then, without quitting the app, try // changing the primarySwatch below to Colors.green and then invoke // "hot reload" (press "r" in the console where you ran "flutter run", // or simply save your changes to "hot reload" in a Flutter IDE). // Notice that the counter didn't reset back to zero; the application // is not restarted. primarySwatch: Colors.blue, ), home: MyHomePage(title: 'Flutter Demo Home Page'), ); } } //Part4 class MyHomePage extends StatefulWidget { MyHomePage({Key key, this.title}) : super(key: key); // This widget is the home page of your application. It is stateful, meaning // that it has a State object (defined below) that contains fields that affect // how it looks. // This class is the configuration for the state. It holds the values (in this // case the title) provided by the parent (in this case the App widget) and // used by the build method of the State. Fields in a Widget subclass are // always marked "final". final String title; @override _MyHomePageState createState() => _MyHomePageState(); } //Part5 class _MyHomePageState extends State<MyHomePage> { int _counter = 0; void _incrementCounter() { setState(() { // This call to setState tells the Flutter framework that something has // changed in this State, which causes it to rerun the build method below // so that the display can reflect the updated values. If we changed // _counter without calling setState(), then the build method would not be // called again, and so nothing would appear to happen. _counter++; }); } @override Widget build(BuildContext context) { // This method is rerun every time setState is called, for instance as done // by the _incrementCounter method above. // // The Flutter framework has been optimized to make rerunning build methods // fast, so that you can just rebuild anything that needs updating rather // than having to individually change instances of widgets. return Scaffold( appBar: AppBar( // Here we take the value from the MyHomePage object that was created by // the App.build method, and use it to set our appbar title. title: Text(widget.title), ), body: Center( // Center is a layout widget. It takes a single child and positions it // in the middle of the parent. child: Column( // Column is also a layout widget. It takes a list of children and // arranges them vertically. By default, it sizes itself to fit its // children horizontally, and tries to be as tall as its parent. // // Invoke "debug painting" (press "p" in the console, choose the // "Toggle Debug Paint" action from the Flutter Inspector in Android // Studio, or the "Toggle Debug Paint" command in Visual Studio Code) // to see the wireframe for each widget. // // Column has various properties to control how it sizes itself and // how it positions its children. Here we use mainAxisAlignment to // center the children vertically; the main axis here is the vertical // axis because Columns are vertical (the cross axis would be // horizontal). mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ Text( 'You have pushed the button this many times:', ), Text( '$_counter', style: Theme.of(context).textTheme.headline4, ), ], ), ), floatingActionButton: FloatingActionButton( onPressed: _incrementCounter, tooltip: 'Increment', child: Icon(Icons.add), ), // This trailing comma makes auto-formatting nicer for build methods. ); } }
私はUnityである程度アプリ開発をしていたので「言語変わっても意外にいけるかな?」と思っていたんですが、まあああったく意味わかんなかったですね笑
なので少しづつ調べました順にざっくり解説していきます
Part1
ライブラリを使用するために必要なコードです
flutter/material.dartをプロジェクトにimport(いれる)するってことです
ちなみに、このコードを消してしまうとflutterの基礎的なパーツなどが全て使えなくなってしまうのでいじらずにそのままにしておきましょう!
Part2
void main(){} です
これは、main関数と呼ばれるもので、プロジェクトを実行した時に最初に呼ばれる関数らしいです!
ってことで、main関数内の「runApp(MyApp());」をコメントアウト(削除)してプロジェクトを実行してみました
何も表示されませんでした!
main関数内のコードが最初に呼ばれていることは間違いなさそうですね〜
part3
次に class MyApp extends StatelessWidget{} について調べてみました
まず、これ直訳(?笑)すると「StatelessWidgetを継承した、MyAppという名前のクラスですよ」っていってるみたいですね
ここで、問題というか最初に疑問符ついたのは「StatelessWidgetって何??????」ってことでした
ってことで検索
StatelessWidgetとは、可変状態を必要としないウィジェット(Widget)らしいですよ〜意味不明ですね〜
とりあえず「今後値が変更されないWidgetを使用する時にStatelessWidgetを継承する」って認識で進めていきます
解釈が違っていた場合は、都度追記していきます〜
ってか、Widgetって何ってずっと思っていたのでそれについても検索してみました
flutterでいうところのWidgetってUIのパーツのことみたいですね〜
(ボタンとかテキストとか入力フォームとかとか)
Part4
同様に class MyHomePage extends StatefulWidget{} についても調べてみました
先ほどと同様にコードを直訳すると「StatefulWidgetを継承したMyHomePageなる名前のクラスだよ〜」っていってますね
さっきはStatelessだったのに今度はStatefulかよ...
でも、これは調べなくてもなんとなくわかりそうですね
多分「今後値が変更されるWidgetを使用する時にStatefulWidgetを継承する」って覚えておけばいいのではないですかね
こちらも解釈の違いに気付いたら都度追記していきまっす
Part5
最後に class _MyHomePageState extends State<MyHomePage> について
また新しいのが出てきた...State<MyHomePage>...
まぁとりあえず例によって例の如く、直訳「State<MyHomePage>を継承した_MyHomePageStateってクラスやでぇ〜」らしいです
!野生の State<MyHomePage> が現れた!
~~~~
▽逃げる
▽検索
▽見つめる
~~~~
↓
~~~~
▽逃げる
▼検索
▽見つめる
~~~~
てるりんぴっく は検索を選択した。(えらい!)
(1日後...)
StatefulWidgetを継承したクラスは「createState()」を実行してState<T>を返却する必要があるそうです!
ってことで先ほどの素晴らしい直訳を少し変更します
「StatefulWidgetを継承したMyHomePageクラスが返却するState<MyHomePage>を、継承した_MyHomePageStateってクラスやでぇ〜」
サンプルコードの流れ
最後に、どんな流れでサンプルコードが実行されているのかをざっくり考えました
まずプロジェクトを起動すると呼ばれるのはmain関数でしたね
↓
main関数内でMyApp()を呼び出していますね
↓
MyAppの中でアプリタイトル、アプリテーマ(色など)、
そしてMyHomePage()を実行します
↓
MyHomePage()内でStateを作成して_MyHomePageStateに渡す
↓
_MyHomePageState()を実行する
って感じですかね〜
参考URL
StatelessWidget class - widgets library - Dart API - Flutter