元記事
ところどころ意訳しています.
前書き
Flutterを始めるために,Dartというプログラミング言語に慣れる必要がある.
このページはDartの優しい紹介である.
もしコードの例を読んで十分であれば,このページをスキップしても良い.
このシリーズを通してDart専門家になる必要はない.
Dart
FlutterはDartで記述されている.
DartはJavaやJavascript,C言語系を書いたことがあれば馴染み深い.
以下のコードは次の小さい処理を行う.
- dart.devからデータをフェッチする
- 返されたjsonをデコードする
- コンソールに出力する
このプログラムを理解できる自信があるなら次のページに行って構わない.
import 'dart:convert';
import 'package:http/http.dart' as http;
class Package {
final String name;
final String latestVersion;
final String? description;
Package(this.name, this.latestVersion, {this.description});
@override
String toString() {
return 'Package{name: $name, latestVersion: $latestVersion, description: $description}';
}
}
void main() async {
final httpPackageUrl = Uri.https('dart.dev', '/f/packages/http.json');
final httpPackageResponse = await http.get(httpPackageUrl);
if (httpPackageResponse.statusCode != 200) {
print('Failed to retrieve the http package!');
return;
}
final json = jsonDecode(httpPackageResponse.body);
final package = Package(
json['name'],
json['latestVersion'],
description: json['description'],
);
print(package);
}
このプログラムは主に2つに分けられる.
-
Package
クラスの宣言 -
main
関数に含まれるビジネスロジック
Package
クラスはDartでクラスを扱うときに使うであろう多くの最も一般的な機能を含む.
Dart言語は型安全である.
型安全とは,変数の値は変数の型と合っていることを保証するために静的な型確認を行うこと.
クラスを定義したとき,String
というアノテーションが必要であるが,型推論があるためしばしば不要となる.
この例におけるmain
関数では,多くの行でfinal variableName =
から始まっている.
明示的に型を指定していないにも関わらず,これらの行は型安全である.
Dartは完全なNull安全である.
この例では,description
メンバはString?
型で定義されている.
String?
の最後の?
はnullになり得ることを意味する.
残り2つの変数はnullにはならず,nullを代入しようとしてもコンパイルエラーが起こる.
Package
クラスのコンストラクタで確認できる.
2つの必須引数(位置引数)と1つのオプション引数(名前引数)を取る.
次はmain
関数の例である.
Flutterアプリを含むすべてのDartプログラムはmain
関数から始まる.
この関数は,使うライブラリをインクルードする,asyncで関数をマークする,関数呼び出しを行う,if文の制御フローなどいくつかのDartの特徴を例示する.
初期化コードはどこへ行ったの?
Flutterアプリを開始するエントリーポイントはlib/main.dart
にある.
デフォルトmain
関数は以下のようになっている.
void main() {
runApp(const MyApp());
}
runApp()
を呼ぶ前に1~2フレーム文の素早い初期化を行う.
ウィジェットツリーはまだ作成されていないことに注意する.
ディスクやネットワーク上からデータを読み込むなど時間がかかる初期化を行う場合,メインのUIスレッドをブロックしないようにする方法で行うこと.
より詳しくは以下のサイトを参考にすること.
- https://dart.dev/libraries/async/async-await
- https://api.flutter.dev/flutter/widgets/FutureBuilder-class.html?_gl=1*jnjirq*_ga*MTMxODM3MDc4Ny4xNzQwMzI0NzM4*_ga_04YGWK0175*MTc0MDMyODAyNC4yLjAuMTc0MDMyODAyNC4wLjAuMA..
- https://docs.flutter.dev/perf/deferred-components
- https://docs.flutter.dev/cookbook/lists/long-lists
すべてのステートフル・ウィジェットは,ウィジェットが作られ,ウィジェットツリーに追加されたときに呼び出されるinitState()
関数を持つ.
この関数はオーバーロードすることができ,そこで初期化を行えるが,このメソッドの最初にsuper.initState()
を記述する必要がある.
最後に,ホットリロードはinitState
やmain
を呼び直さない.
ホットリスタートは呼び直す.
Next : ウィジェット
このページはDartの紹介であり,FlutterとDartのコードを読むのに慣れ親しむ手助けをした.
このページのすべてを完全に理解できなくても,Dart言語の構文に慣れてくるだろう.
次のセクションでは,ウィジェットというFlutterアプリのブロックの組み立て方について学ぶ.