スマホアプリの開発に興味を持ち、勉強中のFlutterについて書いてみました。
特徴
シングルコードベースでのクロスプラットフォーム開発
Flutterを使用すると、1つのコードベースで複数のプラットフォーム向けのアプリを開発できます。これにより、開発時間とコストを大幅に削減できます。
高性能
Flutterは、独自の描画エンジンであるSkiaを使用しており、プラットフォーム固有のウィジェットを使用せずに一貫したパフォーマンスを提供します。
豊富なウィジェット
Flutterには、マテリアルデザインやカーパーノデザインに基づいた豊富な組み込みウィジェットがあり、カスタマイズも容易です。
Hot Reload機能
Hot Reloadにより、コードの変更が即座にアプリに反映されます。これにより、開発とデバッグの効率が大幅に向上します。
Dart言語
Flutterは、シンプルで学習しやすいオブジェクト指向言語であるDartを使用します。Dartは、静的型付け言語でありながら、柔軟な記述が可能です。
ウィジェット(Widget)
Flutterのアプリはすべてウィジェットで構成されます。ウィジェットは、視覚的な要素だけでなく、レイアウトや動作も定義します。
ウィジェットの種類
StatelessWidget:状態を持たない不変のウィジェット。
StatefulWidget:内部に状態を持ち、状態の変化に応じて再描画されるウィジェット。
例を交えた説明
StatelessWidgetの例
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'StatelessWidgetの例',
home: Scaffold(
appBar: AppBar(
title: Text('StatelessWidget'),
),
body: Center(
child: Text('これは状態を持たないウィジェットです'),
),
),
);
}
}
説明:
MyAppはStatelessWidgetを継承し、状態を持たないシンプルなウィジェットを定義しています。
buildメソッドでUIを構築し、画面にテキストを表示します。
StatefulWidgetの例
import 'package:flutter/material.dart';
void main() => runApp(CounterApp());
class CounterApp extends StatefulWidget {
@override
_CounterAppState createState() => _CounterAppState();
}
class _CounterAppState extends State<CounterApp> {
int _counter = 0;
void _incrementCounter() {
setState(() {
_counter++;
});
}
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'StatefulWidgetの例',
home: Scaffold(
appBar: AppBar(
title: Text('StatefulWidget'),
),
body: Center(
child: Text(
'ボタンを押した回数: $_counter',
style: TextStyle(fontSize: 24),
),
),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
tooltip: '増加',
child: Icon(Icons.add),
),
),
);
}
}
説明:
CounterAppはStatefulWidgetを継承し、内部に状態(_counter)を持ちます。
setStateメソッドを使って状態を更新し、UIを再描画します。
画面下部のボタンを押すと、カウントが増加します。
状態管理
setState
setStateメソッドを使用して、ウィジェットの状態を更新し、再描画をトリガーします。
例:
void _updateState() {
setState(() {
// 状態を更新するコード
});
}
状態管理パッケージ
大規模なアプリケーションでは、状態管理を効率化するために以下のパッケージが利用されます。
Provider:公式推奨の状態管理パッケージ。
Bloc:ビジネスロジックとUIを分離するアーキテクチャパターン。
Riverpod:Providerの改善版として設計されたパッケージ。
レイアウトとレイアウトウィジェット
レイアウトの基本
Flutterでは、ウィジェットをネストして複雑なレイアウトを構築します。
主なレイアウトウィジェット
Container:パディングやマージン、背景色などを設定可能。
RowとColumn:ウィジェットを水平方向や垂直方向に配置。
Stack:ウィジェットを重ねて配置。
例:Columnウィジェット
Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('上のテキスト'),
Text('下のテキスト'),
],
)
ナビゲーションとルーティング
ナビゲーション
複数の画面間を遷移するためにNavigatorウィジェットを使用します。
画面遷移の例:
Navigator.push(
context,
MaterialPageRoute(builder: (context) => SecondScreen()),
);
戻る操作
Navigator.pop(context);