LoginSignup
4
5

More than 3 years have passed since last update.

Flutter 画面遷移でデータを渡す

Posted at

こちらの記事の続きになります。
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)するときに、コンストラクタでデータを渡したいからです。
そのように作ってしまったので、既に作成済みのテストコードを生かすためこの方法を採りました。

4
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
5