こちらの記事の続きになります。
https://qiita.com/kasa_le/items/8c80ae565186c9ac275a
ゴール
List-Detailな画面構成などで、次に遷移しようとしている画面に動的にデータを渡せる。
参考サイト
こちらのそのままです。
https://flutter.dev/docs/cookbook/navigation/navigate-with-arguments
実装
上記の記事の、
のパターンで行くことにしました。
各画面クラスでModalRoute.of(context).settings.arguments
として取得するのは、AndroidでいうIntentっぽくて良いかなと思ったのですが、テストするときに問題があると判明し、そのようにしました。
1.引数クラス
class RecordData{
RecordData(this.datetime, this.message, this.count);
final DateTime datetime;
final String message;
final int count;
}
こんなクラスのデータをまるっと渡したいとします。
2.マテリアルルートの変更
return MaterialApp(
// Navigator
navigatorKey: locator<NavigationService>().navigatorKey,
routes: {
'/': (context) => HomePage(),
'/next': (context) => NextPage(),
},
initialRoute: "/",
こうなっていたのを、次のように書き変えます。
navigatorKey: locator<NavigationService>().navigatorKey,
onGenerateRoute: (settings) {
switch (settings.name) {
case '/':
{
return MaterialPageRoute(
builder: (context) => MainPage());
}
case '/input':
final RecordData args = settings.arguments;
return MaterialPageRoute(
builder: (context) => NextPage(date: args));
default:
return MaterialPageRoute(
builder: (context) =>
Scaffold(
body: Center(
child: Text('No path for ${settings.name}'),
),
));
}
},
3.遷移時にデータオブジェクトをセットする
前回の記事でViewModel側に書いた遷移処理を修正します。
void navigateNextPage(RecordData record) {
// ルート遷移
final NavigationService _navigationService = locator<NavigationService>();
_navigationService.navigateTo('/input', args: record);
}
args:
で渡すだけですね。
テストのためと書いたのは、NextPage
を単体テスト(Widget Test)するときに、コンストラクタでデータを渡したいからです。
そのように作ってしまったので、既に作成済みのテストコードを生かすためこの方法を採りました。