VoidCallbackとFunction(x)を使用してFlutterを使用してウィジェット間で通信する方法
序章
Flutterプロジェクトの優れたパラダイムは、ウィジェットを、コンテキストに適応できる小さなテスト可能なユニットに分割することです。
Flutterは、子ウィジェットと親ウィジェット間のコールバックスタイルのイベントにVoidCallback
とFunction(x)
(x
は異なるタイプにすることができます)を提供します。
この記事では、コールバックスタイルのイベントを使用してウィジェット間でFlutterと通信します。
前提条件
この記事をフォローするには、次のものが必要です。
- Flutterをダウンロードしてインストールするには。
- Android StudioまたはVisual StudioCodeをダウンロードしてインストールするには。
- コードエディタ用のプラグインをインストールすることをお勧めします。
AndroidStudio用にインストールされたFlutterおよびDartプラグイン。 VisualStudioCode用にインストールされたFlutter拡張機能。
この記事は、Flutter v1.22.2、Android SDK v30.0.2、およびAndroidStudiov4.1で検証されました。
ステップ1—プロジェクトの設定
Flutter用に環境を設定したら、次のコマンドを実行して新しいアプリケーションを作成できます。
- flutter create flutter_widget_communication
新しいプロジェクトディレクトリに移動します。
- cd flutter_widget_communication
flutter create
を使用すると、ボタンがクリックされた回数を表示するデモアプリケーションが作成されます。
コールバックスタイルのイベントを試すために生成されたコードに基づいて構築します。
ステップ2—親ウィジェットから子ウィジェットにデータを渡す
親ウィジェット(CounterPage
)と子ウィジェット(Count
)を作成します。 親からのcount
値が子に表示されます。
コードエディタでmain.dart
を開き、CounterPage()
を使用するように変更します。
import 'package:flutter/material.dart';
import 'counter_page.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
Widget build(BuildContext context) {
return MaterialApp(
title: 'Widget Communication',
theme: ThemeData(
primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: CounterPage(),
);
}
}
このコードはCounterPage
を表示します。
新しいcounter_page.dart
ファイルを作成し、次のコード行を追加します。
import 'package:flutter/material.dart';
import 'count.dart';
class CounterPage extends StatefulWidget {
_CounterPageState createState() => _CounterPageState();
}
class _CounterPageState extends State<CounterPage> {
int count = 0;
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text("Widget Communication")),
body: Center(
child: Count(count),
),
);
}
}
このコードは、count
を子ウィジェットに渡します。
新しいcount.dart
ファイルを作成し、次のコード行を追加します。
import 'package:flutter/material.dart';
class Count extends StatelessWidget {
final int count;
Count(this.count);
Widget build(BuildContext context) {
return Text("$count");
}
}
コードをコンパイルして、エミュレーターで実行します。
これにより、画面にcount
(現在はゼロに設定されています)が表示されます。
次に、VoidCallback
を追加します。
ステップ3—VoidCallback
を使用する
このチュートリアルでは、クリックを登録して親CounterPage
に通知するButton
を作成する必要があります。
ここで値を返したくないので、VoidCallbackを登録する必要があります。 また、Count
コンストラクター内の項目に中括弧を追加して、名前付きパラメーターにします。
count.dart
に再度アクセスし、onCountSelected
を追加します。
class Count extends StatelessWidget {
final int count;
final VoidCallback onCountSelected;
Count({
this.count,
this.onCountSelected,
});
Widget build(BuildContext context) {
return FlatButton(
child: Text("$count"),
onPressed: () => onCountSelected(),
);
}
}
次に、counter_page.dart
に再度アクセスし、onCountSelected
コールバックをリッスンします。
import 'package:flutter/material.dart';
import 'count.dart';
class CounterPage extends StatefulWidget {
_CounterPageState createState() => _CounterPageState();
}
class _CounterPageState extends State<CounterPage> {
int count = 0;
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text("Widget Communication")),
body: Center(
child: Count(
count: count,
onCountSelected: () {
print("Count was selected.");
},
)
),
);
}
}
コードをコンパイルして、エミュレーターで実行します。 ボタンを操作して、コンソールの出力を確認します。
OutputCount was selected.
ただし、この時点では、count
の値はゼロのままです。
次に、Function(x)
を追加します。
ステップ4—Function(x)
を使用する
VoidCallback
は、期待値のないコールバックイベントに役立ちます。 親に値を返したいシナリオでは、Function(x)
を使用することをお勧めします。
count.dart
に再度アクセスし、Function(int)
onCountChanged
を追加します。
import 'package:flutter/material.dart';
class Count extends StatelessWidget {
final int count;
final VoidCallback onCountSelected;
final Function(int) onCountChanged;
Count({
this.count,
this.onCountChanged,
this.onCountSelected,
});
Widget build(BuildContext context) {
return Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
IconButton(
icon: Icon(Icons.add),
onPressed: () {
onCountChanged(1);
},
),
FlatButton(
child: Text("$count"),
onPressed: () => onCountSelected(),
),
IconButton(
icon: Icon(Icons.remove),
onPressed: () {
onCountChanged(-1);
},
),
],
);
}
}
次に、counter_page.dart
に再度アクセスし、onCountChange
コールバックをリッスンします。
import 'package:flutter/material.dart';
import 'count.dart';
class CounterPage extends StatefulWidget {
_CounterPageState createState() => _CounterPageState();
}
class _CounterPageState extends State<CounterPage> {
int count = 0;
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text("Widget Communication")),
body: Center(
child: Count(
count: count,
onCountSelected: () {
print("Count was selected.");
},
onCountChanged: (int val) {
setState(() => count += val);
},
)
),
);
}
}
ボタンがクリックされると、変更値がCount
子ウィジェットからCounterPage
親ウィジェットに渡されます。 次に、val
とcount
の間の加算が実行され、count
が更新されます。
コードをコンパイルして、エミュレーターで実行します。
Add (+
)および Remove (-
)ボタンを操作すると、count
の値がそれぞれインクリメントおよびデクリメントされます。
結論
この記事では、VoidCallback
とFunction(x)
を使用して、コールバックスタイルのイベントを使用してウィジェット間でFlutterと通信する方法を学習しました。
Flutterについて詳しく知りたい場合は、Flutterトピックページで演習とプログラミングプロジェクトを確認してください。