目次
はじめに
こんにちは,光岡です. 最近スマホアプリケーションを作りたくなり,Flutterを触り始めました! Flutterとは,一つのソースコードでiOS・Androidのアプリを開発することができる「クロスプラットフォーム」(マルチプラットフォーム)に位置づけられるGoogleが開発したフレームワークのことです.Dartという言語を利用して開発します.
以前までは,IOSアプリはSwift,AndroidアプリはKotlinなどのプログラミング言語が主流で,両方のアプリを作りたい場合は,それぞれで開発する必要がありましたが,Flutterはその課題を解消してくれます!
便利なFlutterですが,参考になる書籍や記事が他の言語に比べるとまだまだ少ないかな?という印象があり,日ごろバックエンド開発ばかりしている私にとって,何だかよく分からんとなっていました.
そこで本記事では,Flutter入門する際に,ざっくりでも把握しておくと後々スムーズに開発できるであろう機能などについてご紹介していきたいと思います!
対象読者
- Flutterのドキュメント等をざっと見た方(本記事では網羅的に紹介しないため)
- チュートリアルなどやってみたものの,何となくしかまだ理解できていない方
Dartの基礎文法
Dartは静的型付け言語です.dynamic型と呼ばれる特徴的な型を利用して動的型付け言語のようにも扱うことも可能です.
変数宣言
var 変数名 = 値; or <型> 変数名 = 値;
定数宣言
const <型> 定数名 = 値; or final <型> 定数名 = 値; or late <型> 定数名 = 値;
最初Flutterでの開発を始めた時,final
が見慣れておらず,何だろう?となりましたが,この書き方で定数を宣言することができます!
const
とfinal
の違いは,constはコンパイル時に評価され、finalは実行段階で評価される点です.
また,late
は下記2つの特徴があります.
- nullを許容しない
- 遅延評価によるパフォーマンス改善
関数
void hello(String name) { print('Hello ${name}!'); }
引数に型の指定をします.
void
を使う場合は,返り値なしです.
非同期処理
Future<String> hello() async { await Future.delayed(Duration(seconds: 3)); return "Hello!"; }
非同期処理を実装する場合,Future
, async
, await
を利用します.
JavaScriptを触ったことがある方は,async
, await
は馴染みあるものかと思います.
Widgetのクラスの使い方について
Widgetとは,UIパーツのことを指します. 私は下記コードのように,Classを作成する際,継承するWidgetクラスに何を使えばよいのか迷うことが多かったので,まとめてみました!
class MyHomePage extends XxxxWidget { . . }
StatelessWidget
値の変更をしないときに利用します.
StatefulWidget
値の変更が可能です あまり推奨されておらず,後述のものを使用した方が良いそうです!
ConsumerWidget
RIverpodを利用しているとき,StatelessWidgetではなく,ConsumerWidgetを使います!
ほぼ同等のものであり、build メソッドに第2パラメータのref
が存在するかどうかの違いのみです!
class HomeView extends ConsumerWidget { const HomeView({Key? key}) : super(key: key); @override Widget build(BuildContext context, WidgetRef ref) { // `ref` を使ってプロバイダーを監視する final counter = ref.watch(counterProvider); return Text('$counter'); } }
Provider, RIverpodとは) プロバイダの利用方法
ConsumerStatefulWidget
Riverpodを利用している際,変数 & provider変数の変更が可能です
StatefulWidgetとの違いは,ConsumerWidget同様,ref
が存在するかどうかの違いです!
class HomeView extends ConsumerStatefulWidget { const HomeView({Key? key}) : super(key: key); @override HomeViewState createState() => HomeViewState(); } class HomeViewState extends ConsumerState<HomeView> { @override void initState() { super.initState(); // `ref` は StatefulWidget のすべてのライフサイクルメソッド内で使用可能です。 ref.read(counterProvider); } @override Widget build(BuildContext context) { // `ref` は build メソッド内で使用することもできます。 final counter = ref.watch(counterProvider); return Text('$counter'); } }
HookWidget
Flutter Hooks(UIの状態管理をサポートするライブラリ)を利用しているときに使用します
RiverpodとFlutterHooksの使い分けは下記を目安にすると良いと思います! - グローバルにステート情報を管理したい → Riverpod - 1つのwidgetでステート情報が完結する → Flutter Hooks
HookConsumerWidget
HookWidgetと,ConsumerWidgetの役割の両方を持ちます.
おわりに
他の言語を触っているから何となくコード読めば理解できるけど,いざ開発してみるとスムーズに進まない...と感じている方がいたら,ぜひ一読していただけたら嬉しいです!
参考文献
- Flutter基礎入門 by Flutter大学
- Flutter開発をマスターするための手引き 2022年版
- Dart入門
- 【Flutter】非同期処理:Future・FutureBuilder使い方を3分で解説!(サンプルコードあり)
- 【Flutter】Providerを利用したときStatelessWidget、StatefulWidget、ConsumerWidget、ConsumerStatefulWidgetのそれぞれの使い方
- 【5分でわかる】Flutter Hooksの使い方とRiverpodと使い分け | Flutter入門
- 【5分でわかる】RiverpodとProviderをわかりやすく解説 | Flutter入門
- プロバイダの利用方法