Flutter WebのhistoryモードのNavigationとRoutingをFirebase Hostingで行う方法を解説します。
まず、Flutter WebはSPA(Single Page Application)なので、Routingにはhistoryモードとhashモードがあります。
hashモードとはhash「#」の後にSPAで定義したRoutingがURLになる方式です。
例: http://localhost:3000/#/blog
hashモードはSPAで定義したRoutingがそのままURLになる方式です。
例: http://localhost:3000/blog
SPAは/index.html
を呼んで、そのページで全てが完結するので、何も考えないとRoutingはhashモードになる事が多いです。Flutter Webも同様です。
なぜデフォルトでhashモードになるかと言うと、静的Hostingサービスで/blog
にアクセスした場合、/blog
というファイルが存在していないため404
判定を受けてしまうからです。
hashモードのURLの場合は、hashがある事によって、/#/blog
は/index.html
を見に行っているので問題なく目的のページが表示されるわけです。
しかし、hashモードのURLはあまり見慣れないので、Flutter Webでもhistoryモードにする方法をみていきます。
historyモード実現のために、vrouterというFlutter Pluginを使用します。
https://pub.dev/packages/vrouter
/
と/blog
というURLがあって、それ以外のURLにアクセスがあった場合は/
にリダイレクトするという動きをするアプリのサンプルコードです。
build(BuildContext context) {
return VRouter(
debugShowCheckedModeBanner: false,
mode: VRouterModes.history,
routes: [
VWidget(
path: '/',
widget: IndexPage(),
buildTransition: (animation, _, child) {
return FadeTransition(opacity: animation, child: child);
},
),
VWidget(
path: '/blog',
widget: BlogPage(),
buildTransition: (animation, _, child) {
return FadeTransition(opacity: animation, child: child);
},
),
VRouteRedirector(
redirectTo: '/',
path: r'*',
),
],
);
}
Widget
vrouterでは、VRouter()
をMaterialApp()
の代わりに使うので、MaterialApp()
は不要になります。
mode
をVRouterModes.history
に設定し、サンプルコードの通りにroutes
実装するとRouting設定は完了です。
以下のコードで/
から/blog
に遷移できます。
context.vRouter.push('/blog');
ChromeをターゲットにDebug Runしてみます。
無事historyモードでURLが表示されました!
ちなみに、ここでlocalhost:54025/blog
のページをリロードしても、問題なくブログページは表示されます。
Firebase Hostingにこのアプリをデプロイしてみます。
Firebaseでプロジェクトを作成し、Flutterアプリのディレクトリ内でfirebase init
し、Firebase Hostingにデプロイできるようにします。
flutter build web --web-renderer html
firebase deploy
でFirebase Hostingにデプロイします。
デプロイ先のリンクを見てみます。
いい感じに動作しています。
/blog
のページをリロードしてみます。すると、、、
404になってしまいました...これは最初に説明したように、/blog
というファイルが存在していないからですね。
firebase.json
の設定で、アクセスされたURLをrewriteする事ができるので、全てのURLアクセスを/index.html
を見るように変更させます。
{
"hosting": {
...
"rewrites": [
{
"source": "**",
"destination": "/index.html"
}
]
}
}
再度Build&Deployして、リロードを試してみます。
/blog
でリロードし、無事blogのページが表示されました🎉🎉🎉
これで、Flutter Webでも通常のWebページと同じようなURLでRoutingできるようになりました。
vrouterはusers/:id
のようなdynamicなURLにも対応しているので、Flutter WebでWebサービスを開発するという選択も現実的になってきたのではないでしょうか。
Hostingを使ってSPAをデプロイしている以上、ogpの問題はありますが、そこまでogpが重要なサービスも少ないでしょう、という事でそこは目を瞑って...
可茂IT塾ではFlutterインターンを募集しています!可茂IT塾のエンジニアの判断で、一定以上のスキルをを習得した方には有給でのインターンも受け入れています。
Read More可茂IT塾ではFlutterインターンを募集しています!可茂IT塾のエンジニアの判断で、一定以上のスキルをを習得した方には有給でのインターンも受け入れています。
Read More