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();
});
}
},
);
参考