0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Flutter webでクエリストリングを考慮したルーティング

Posted at

Flutter webでクエリストリングを考慮したルーティングの方法を紹介します。
私の調査不足のせいかサクッと実現する方法が見つからなかったので以下のような実装になりました。

問題

以下のようなルーティング設定をした場合、 /hoge でアクセスすればHogeScreenが表示されます。
しかし、 /hoge?a=b でアクセスした場合は、HogeScreenは表示されずDefaultScreenが表示されてしまいます。
期待する動作としては、クエリストリングの含まれたリクエストでも /hoge というパス部分でルーティングしてほしいです。

MaterialApp(
      // 略
      home: DefaultScreen(),
      routes: {
        "/hoge": (context) { 
          return HogeScreen();
        },
        "": (context) => DefaultScreen()
      },
    );

解決方法

以下のように onGenerateRoute を記述することでパス部分のみに依存したルーティングが可能になります。

MaterialApp(
      // 略
      home: DefaultScreen(),
      onGenerateRoute: (setting) {
        print(setting);
        String? name = setting.name;
        if (name == null ){
          // TODO
          return null;
        }
        final uri = Uri.parse(name);
        print(uri.path);
        print(uri.pathSegments);
        print(uri.queryParameters["xxx"]);
        if (uri.path == "/hoge){
          return MaterialPageRoute(builder: (context){
            return HogeScreen();
          });
        } else {
          return MaterialPageRoute(builder: (context){
            return DefaultScreen();
          });
        }
      },
    );

参考

0
1
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
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?