SlideShare a Scribd company logo
1 of 31
Download to read offline
go_router が隠してくれるもの
Navigatorと Routerと これから
1
robo
【IWD2022】集え Flutter レディース
自己紹介
名前
robo (兼高理恵)
好きなもの
モバイル端末
おしごと
アプリの要件定義と仕様策定、設計から実装&改修まで
所属
GDG Kyoto (Organizer) WTM Kyoto (Ambassador)
Flutter Osaka (staff) FlutterKaigi (staff)
2
はじめに
go_routerは、v3.0.2 から Flutter package に移管され
Flutterチームがメンテナンスするようになりました。
gorouter.dev の公式ドキュメントも、
これから docs.flutter.dev に移動するそうです。
● gorouter.dev
https://gorouter.dev/
● docs.flutter.dev
https://docs.flutter.dev/
3
Chris Sells さんの移管報告ツイート (2022/02/25)
https://twitter.com/csells/status/1496983180791873538
公式ドキュメントの移動は、まだのようですが、
リポジトリは Flutter package に移管済です。
バージョンも移管から 2ヶ月経過した、
現在(2022/04/20)では、3.0.7 まで進んでいます。
● go_router (pub.dev)
https://pub.dev/packages/go_router
● go_router changelog
https://pub.dev/packages/go_router/changelog
● go_router repository
https://github.com/flutter/packages/tree/main/packages/go_router
● go_router issue
https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+go_router%22 4
5
Chris Sells さんの go_router リポジトリ (現在アーカイブとなり read-only になっています)
https://github.com/csells/go_router
Chris Sells さんの
go_router リポジトリは、
アーカイブされました。
アーカイブに伴い、
Contributor toshi-kuji さん
による邦訳ドキュメントも
read-only になっています。
おわび
セッションでは、go_router の実装法について話しません。
ナビゲーションとルーティングの基本の確認となっています。
go_router の概要や使い方や具体例については、
Flutter package に移管されてからまだ日が浅いため、
邦訳された公式ドキュメントを一読するのが良いと思います。
注意)一部の移管前リソースを参照するリンクは、404になっています。
6
7
go_routerとは
go_router パッケージが目指すもの
宣言的ルートを使用して、以下の複雑さを軽減させること+α(意訳です)
● ディープリンクやダイナミックリンクの取り扱い
● そのほかのナビゲーション関連シナリオへの対応
● これらのプラットフォーム①
に依らない解決方法
● 願わくば、使いやすい開発体験を提供すること。
①
iOS、Android、モバイル、ウェブ、 デスクトップ
8
go_router
https://pub.dev/packages/go_router
go_router パッケージが提供するもの
公式ドキュメント日本語版の目次より
● 宣言的なルーティング(Routing)
○ 遷移経路のルート定義の説明 ⇒ GoRouter.routes への GoRoute ツリー構造の登録
● ナビゲーション
○ ページ間遷移の方法の説明 ⇒ GoRouter.go メソッドの使い方
● パラメータ
○ クエリパラメータ定義の説明 ⇒ GoRoute.builder state 引数の使い方
● サブルート
○ 遷移経路のサブツリー定義の説明 ⇒ GoRoute.routes への GoRoute ツリー構造の登録
9
go_router 公式ドキュメント日本語版の目次
https://zenn.dev/inari_sushio/scraps/01ef7604a4b934
go_router パッケージが提供するもの
● リダイレクト
○ ページリダイレクト方法の説明 ⇒ GoRouter.redirect への GoRoute差替先の登録
● 名前付きルート
○ パス特定識別名定義の説明 ⇒ GoRoute.name への パス識別名の登録
● ユーザー入力フォーム
○ ページ間データ授受方法の説明 ⇒ GoRoute は呼出先からの返値を受け取れないので、
  呼出先で呼出元オブジェクトに値を入れてもらう。
● ネスト(入れ子)型ナビゲーション
○ アドレスバー対応の部分遷移の説明 ⇒ GoRoute.path と builder state を使った
   同一ページパスのタブ別パラメータ定義
● サンプルコード集
○ go_router の具体的な使用方法のサンプル
10
これらは、
Navigator 2.0 の複雑さを隠してくれます。
Navigator 2.0 とは何か(Navigator と Router)
Navigation and routing では、
Flutterでは、ページ遷移の経路制御を行う、
命令型ルーティング (imperative routing mechanism) の Navigator ウィジェットと、
宣言型ルーティング (declarative routing mechanism) の Router ウィジェットがあることや
Navigator API は、簡単なページ遷移に役立ち、
Router API は、より複雑なページ遷移に役立つことと
そして、Router と宣言的ルーティングの学習資料として、
Learning Flutter’s new navigation and routing system が紹介されています。
11
Navigation and routing
https://docs.flutter.dev/development/ui/navigation
Navigator 2.0 とは何か(Navigator と Router)
Learning Flutter’s new navigation and routing system では、
新しくなった Navigator API と 新たに追加された Router API を使って、
ページ遷移の制御や、ルート (遷移経路) の解析をより細かくする方法が、
Navigator 2.0 だと説明されています。
Navigator 2.0 は、複数のページをプッシュまたはポップしたり、
現在のページの下にあるページを削除したりするこができますが、
既存の方法のまま Navigator API を使い続けることもできるとあります。
12
Learning Flutter’s new navigation and routing system
https://medium.com/flutter/learning-flutters-new-navigation-and-routing-system-7c9068155ade
Navigator 1.0 とは
Navigator 1.0 は、Navigator と Route を利用した旧来のページ遷移法です。
● Navigator
Route (起点) オブジェクトのスタックを管理するウィジェット
● Route
画面ウィジェットツリーのルート (起点) を表すウィジェット
一般的には、MaterialPageRoute が利用される。
● Route (起点) オブジェクトを Navigator.push で直接 生成するか、
MaterialApp.routes に名前付きの Builder を定義 (Named routes) するかして、
Navigator のスタックに push/pop で出し入れしてページ遷移を行います。
13
Navigator 1.0 とは
通常 Navigator は、アプリに1つ (MaterialApp にバインドされる) であり、
その Navigator オブジェクトに push/pop により、
Route をスタックに出し入れさせる命令型ルーティングを行います。
仕組みが単純で扱い易いのですが、
画面を任意で積み上げ取り去りできるので、
現在の画面がどのような経路で積み上げられ
た(遷移してきた)のかを知るには、独自の履歴
管理が必要です。
14
Navigator 2.0 とは
Navigator 2.0 は、Page、Router、RouteInformationParser、RouterDelegate、
BackButtonDispatcher を利用した新しいページ遷移と経路制御管理法です。
● Page
Navigator の遷移履歴スタック(pages) で管理される不変のオブジェクト。
● Router
Navigator が遷移を表現できるよう Page の遷移履歴スタックを構成します。
Page の遷移履歴スタックは、基盤となるプラットフォームまたは
アプリの状態の変化に基づいて変化します。
15
Navigator 2.0 とは
● RouteInformationParser
RouteInformationProvider から取得した RouteInformation が、
どの遷移パスに対応するデータかを解析します。
● RouterDelegate
Router がアプリ固有のページ遷移挙動を行えるよう、
検出したアプリの状態変化に応じた Router への通知をおこないます。
そのために、RouteInformationParser とアプリの状態および、
Navigator が持つ Page の遷移履歴スタックの再構築を監視します。
● BackButtonDispatcher
戻るボタンの押下を RouterDelegate ⇒ Router に通知します。
16
Navigator 2.0 とは
17
【参考】Flutter2の新しい画面遷移「Navigator 2.0」を使ったページ遷移を理解しよう
  https://codezine.jp/article/detail/14532
Page、Router、RouteInformationParser、
RouterDelegate、BackButtonDispatch
の相互作用例
go_router が隠していたもの
「go_router が提供するもの」で紹介した機能は、
 前ページまでに登場した Navigator 2.0 を使うための要素 …
Navigator、遷移履歴スタック、遷移パス、Page、
Router、RouteInformationParser、RouteInformationProvider、
RouteInformation、RouterDelegate、BackButtonDispatcher を隠し、
 GoRouter と GoRoute で機能を提供してくれていたようです。
18
Navigator 2.0 の背景を学ぶ
Flutter Design Documents には、
様々な仕様提案が公開されています。
その中には、Router API についての提案があります。
ドキュメントでは、Navigator 2.0 が必要になる
背景や解決案について述べられています。
Introduce a declarative API to set the history stack of
the Navigator and a new Router widget to configure
the Navigator based on app state and system events.
19
Router (PUBLICLY SHARED)
https://docs.google.com/document/d/1Q0jx0l4-xymph9O6zLaOY4d_f7YFpNWX_eGbzYxr9wY/edit
紹介のみ
20
go_routerのこれから (予想)
go_router のこれから
go_router が、Flutter package に
移管されてから2ヶ月が経ち...
Flutter Design Documents に
go_router が、これから
どこに向かうのかを示唆する
仕様提案が今月追加されました。
go-router-improvements
21
GoRouter API improvements (PUBLICLY SHARED)
https://docs.google.com/document/d/1_mRXinbL_rb0mUt6DAFZ8kj0kh33ZjEMJuUq4PJgwj8/edit
go_router のこれから
ドキュメントでは、
● GoRouterは、
Router ウィジェットに基づいた簡略化された API を提供してくれますが
● 現在 GoRouter には、
Focus issues、Absolute paths、Shell UI、Redirection
という 課題がある ことと
● StackedRoute、NavigatorRoute、
ShellRoute +(preserveState パラメータ)、RouteState
という 新規 API が提案 されています。
22
Absolute paths 課題
GoRouter は、相対パスへのナビゲートをサポートしていません。
例えば、HomeScreen と Ascreen があるとして、
ページ遷移の構成が HomeScreen ⇒ Ascreen とするので、
GoRouteの routes を使ってパスの入れ子構造①
を作れても、
go('/home') の次は、go(’/home/a’) のように絶対パスの使用を強制します。
① GoRouter(routes: [ GoRoute(path: '/home', routes: [ GoRoute(path: 'a' routes: []), ), ),
23
Focus issues 課題
GoRouteの外側に Scafold を生成させるとフォーカスに課題があります。
GoRouter コンストラクタ引数の navigatorBuilder で、
GoRoute の周囲(外郭) に UI を構築させることができますが、
Scafold を構築させるとフォーカスの問題が発生する可能性がある課題
24
Shell 課題
ここでの Shell は、子コンポーネントの周りに描画された UI を表す用語です。
Shell とは、子コンポーネントの周りに描画された UI のことですが、
遷移描画ウィジェットにとって、自分の外側(外郭) に親UIが存在するため、
ナビゲーションで全画面再構築はしていないが、
ページ遷移なので、
アドレスバーなどでパスを変える必要が発生する課題です。
一般的な対象例として、
BottomNavigationBar、AdaptiveNavigationScaffold、
または TabBar が挙げられます。
25
Redirection 課題
右のサンプルコードの内容は、
GoRouter に '/'で HomeScreen を定義し、
'/a'で Ascreen、'/b'で Bscreen を定義しています。
ここで Ascreen に HomeScreen へのリダイレクトを付け、
go('/a') を実行すると HomeScreen が表示されますが、
履歴バックさせても Ascreen には戻らないそうです。
これは、GoRouter のリダイレクト処理が、
最終的な経路パスの Route (ページ) のみ構築するからです。
この最適化により 端折られた途中経過のページ遷移は、
履歴に残るはずもないので、バックしても表示されません。
26
late final GoRouter _router = GoRouter(
routes: <GoRoute>[
GoRoute(
path: '/',
builder: (context, state) => HomeScreen(),
routes: <GoRoute>[
GoRoute(
path: 'a',
builder: (context, state) => AScreen(),
redirect: (_) {
return '/';
},
routes: <GoRoute>[
GoRoute(
path: 'b',
builder: (context, state) => BScreen(),
),
],
),
],
),
],
redirect: (GoRouterState state) {
return null;
},
);
Issue #101183 GoRouterのリダイレクト動作に関するいくつかの問題
https://github.com/flutter/flutter/issues/101183
新規 API 提案
● StackedRoute
GoRoute を StackedRoute に改名し、
パスに一致するサブルートが
親の上にスタックされていることを明示するようにします。
● NavigatorRoute
描画効率化のため 内部 Navigator を生成して、
パスに一致するサブルートを表示させる GoRoute 拡張版ウィジェットです。
27
新規 API 提案
● ShellRoute
子Route の外郭となる 親Route に必要な対応として、
コンストラクタ引数 builder に追加の子パラメーターを提供する、
GoRoute 拡張版ウィジェットです。
○ 追加されたパラメータは、
対応する 子Route の builder を呼び出せるようにします。
○ 一致する 子Route がなかった場合、
このウィジェットは 幅と高さがゼロの SizedBox とします。
28
新規 API 提案
● ShellRoute preserveState パラメータ
ShellRoute に、サブルートの Widget を保持させるパラメータです。
Offstageウィジェットを使用してサブルートのウィジェットを保持します。
以前にアクティブだった Route オブジェクトも保存させます。
● RouteState
相対ルートをサポートするためのオブジェクトです。
GoRouter に
「GoRoute builder を介して構築されたすべてのウィジェットに
RouteState オブジェクトを提供する」ようにさせます。
29
go_router のこれから
go_router パッケージは、
Router ウィジェットに基づいた簡略化された API を提供して、
複雑さを隠蔽してくれています。
新規 API は、提案なので実現するか否かは現時点で不明です。
ですが、新規APIを必要とする課題 は存在しています。
go_router が 隠してくれない課題 があることを認識し、
課題を解決する一助になれたらと願います。
30
31
ご清聴、
ありがとうございました。
情報修正があれば更新します
最新版スライドは こちらから

More Related Content

What's hot

一人でもはじめるGitでバージョン管理
一人でもはじめるGitでバージョン管理一人でもはじめるGitでバージョン管理
一人でもはじめるGitでバージョン管理Takafumi Yoshida
 
開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)mosa siru
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)Takuto Wada
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean ArchitectureAtsushi Nakamura
 
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?Yoshitaka Kawashima
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Kohei Tokunaga
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」Takuto Wada
 
【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発
【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発
【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発日本マイクロソフト株式会社
 
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24Shin Ohno
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Akihiro Suda
 
BuildKitの概要と最近の機能
BuildKitの概要と最近の機能BuildKitの概要と最近の機能
BuildKitの概要と最近の機能Kohei Tokunaga
 
イベント・ソーシングを知る
イベント・ソーシングを知るイベント・ソーシングを知る
イベント・ソーシングを知るShuhei Fujita
 
目grep入門 +解説
目grep入門 +解説目grep入門 +解説
目grep入門 +解説murachue
 
Redisの特徴と活用方法について
Redisの特徴と活用方法についてRedisの特徴と活用方法について
Redisの特徴と活用方法についてYuji Otani
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織Takafumi ONAKA
 
40歳過ぎてもエンジニアでいるためにやっていること
40歳過ぎてもエンジニアでいるためにやっていること40歳過ぎてもエンジニアでいるためにやっていること
40歳過ぎてもエンジニアでいるためにやっていることonozaty
 
ノンプログラマでも今日から使える「Git」でバージョン管理
ノンプログラマでも今日から使える「Git」でバージョン管理ノンプログラマでも今日から使える「Git」でバージョン管理
ノンプログラマでも今日から使える「Git」でバージョン管理H2O Space. Co., Ltd.
 

What's hot (20)

Tackling Complexity
Tackling ComplexityTackling Complexity
Tackling Complexity
 
一人でもはじめるGitでバージョン管理
一人でもはじめるGitでバージョン管理一人でもはじめるGitでバージョン管理
一人でもはじめるGitでバージョン管理
 
開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
 
いつやるの?Git入門
いつやるの?Git入門いつやるの?Git入門
いつやるの?Git入門
 
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
 
【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発
【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発
【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発
 
Docker Compose 徹底解説
Docker Compose 徹底解説Docker Compose 徹底解説
Docker Compose 徹底解説
 
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
BuildKitの概要と最近の機能
BuildKitの概要と最近の機能BuildKitの概要と最近の機能
BuildKitの概要と最近の機能
 
イベント・ソーシングを知る
イベント・ソーシングを知るイベント・ソーシングを知る
イベント・ソーシングを知る
 
目grep入門 +解説
目grep入門 +解説目grep入門 +解説
目grep入門 +解説
 
Redisの特徴と活用方法について
Redisの特徴と活用方法についてRedisの特徴と活用方法について
Redisの特徴と活用方法について
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
 
40歳過ぎてもエンジニアでいるためにやっていること
40歳過ぎてもエンジニアでいるためにやっていること40歳過ぎてもエンジニアでいるためにやっていること
40歳過ぎてもエンジニアでいるためにやっていること
 
ノンプログラマでも今日から使える「Git」でバージョン管理
ノンプログラマでも今日から使える「Git」でバージョン管理ノンプログラマでも今日から使える「Git」でバージョン管理
ノンプログラマでも今日から使える「Git」でバージョン管理
 

Similar to go_router が隠してくれるもの

Flutter_Forward_Extended_Kyoto-Keynote_Summary
Flutter_Forward_Extended_Kyoto-Keynote_SummaryFlutter_Forward_Extended_Kyoto-Keynote_Summary
Flutter_Forward_Extended_Kyoto-Keynote_Summarycch-robo
 
ChatGPT の現状理解と 2023年7月版 LLM情報アップデート
ChatGPT の現状理解と 2023年7月版 LLM情報アップデートChatGPT の現状理解と 2023年7月版 LLM情報アップデート
ChatGPT の現状理解と 2023年7月版 LLM情報アップデートSatoshi Kume
 
Html5概要 & デモ
Html5概要 & デモHtml5概要 & デモ
Html5概要 & デモyoshikawa_t
 
Mautic Meetup Tokyo #3 データベース不要CMS:Gravの紹介
Mautic Meetup Tokyo #3 データベース不要CMS:Gravの紹介Mautic Meetup Tokyo #3 データベース不要CMS:Gravの紹介
Mautic Meetup Tokyo #3 データベース不要CMS:Gravの紹介Kohei Nishikawa
 
Deeplinkから考えるWebとAppの今後とは
Deeplinkから考えるWebとAppの今後とはDeeplinkから考えるWebとAppの今後とは
Deeplinkから考えるWebとAppの今後とはYohhei Someya
 
2013.01.18 G*Workshop GGX 2012 Report
2013.01.18 G*Workshop GGX 2012 Report2013.01.18 G*Workshop GGX 2012 Report
2013.01.18 G*Workshop GGX 2012 ReportYu Sudo
 
Mixed Reality Toolkit V2.4.0の機能 ~ Progress Indicator ~
Mixed Reality Toolkit V2.4.0の機能 ~ Progress Indicator ~Mixed Reality Toolkit V2.4.0の機能 ~ Progress Indicator ~
Mixed Reality Toolkit V2.4.0の機能 ~ Progress Indicator ~Takahiro Miyaura
 
Deeplinkから考えるWebとAppの今後とは
Deeplinkから考えるWebとAppの今後とはDeeplinkから考えるWebとAppの今後とは
Deeplinkから考えるWebとAppの今後とはYohhei Someya
 
HTML5開発最前線
HTML5開発最前線HTML5開発最前線
HTML5開発最前線yoshikawa_t
 
WebRTC NextVersion時代のJavaScript開発
WebRTC NextVersion時代のJavaScript開発WebRTC NextVersion時代のJavaScript開発
WebRTC NextVersion時代のJavaScript開発Yusuke Naka
 
第8回 業開中心会議 LT 「User Agent の 変遷」
第8回業開中心会議 LT 「User Agent の 変遷」第8回業開中心会議 LT 「User Agent の 変遷」
第8回 業開中心会議 LT 「User Agent の 変遷」Akinari Tsugo
 
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力ThinReports
 
Airflow 2.0 migration ガイド
Airflow 2.0 migration ガイドAirflow 2.0 migration ガイド
Airflow 2.0 migration ガイドKatsunori Kanda
 
〜Apache Geode 入門 gfsh によるクラスター構築・管理
〜Apache Geode 入門 gfsh によるクラスター構築・管理〜Apache Geode 入門 gfsh によるクラスター構築・管理
〜Apache Geode 入門 gfsh によるクラスター構築・管理Akihiro Kitada
 
VSCodeで始めるAzure Static Web Apps開発
VSCodeで始めるAzure Static Web Apps開発VSCodeで始めるAzure Static Web Apps開発
VSCodeで始めるAzure Static Web Apps開発Yuta Matsumura
 
Rootage.co.jp技術共有
Rootage.co.jp技術共有Rootage.co.jp技術共有
Rootage.co.jp技術共有rootage-inc
 
【17-E-2】Ruby PaaS「MOGOK」 ~ ソフトウェアエンジニアのためのクラウドサービス ~ 藤原秀一氏
【17-E-2】Ruby PaaS「MOGOK」 ~ ソフトウェアエンジニアのためのクラウドサービス ~ 藤原秀一氏【17-E-2】Ruby PaaS「MOGOK」 ~ ソフトウェアエンジニアのためのクラウドサービス ~ 藤原秀一氏
【17-E-2】Ruby PaaS「MOGOK」 ~ ソフトウェアエンジニアのためのクラウドサービス ~ 藤原秀一氏Developers Summit
 
Operator reading and writing ( Operator SDK 編 )
Operator reading and writing ( Operator SDK 編 )Operator reading and writing ( Operator SDK 編 )
Operator reading and writing ( Operator SDK 編 )ロフト くん
 
安全な"○○でログイン"の作り方 @ NDS in Niigata #1
安全な"○○でログイン"の作り方 @ NDS in Niigata #1安全な"○○でログイン"の作り方 @ NDS in Niigata #1
安全な"○○でログイン"の作り方 @ NDS in Niigata #1Ryo Ito
 

Similar to go_router が隠してくれるもの (20)

Flutter_Forward_Extended_Kyoto-Keynote_Summary
Flutter_Forward_Extended_Kyoto-Keynote_SummaryFlutter_Forward_Extended_Kyoto-Keynote_Summary
Flutter_Forward_Extended_Kyoto-Keynote_Summary
 
ChatGPT の現状理解と 2023年7月版 LLM情報アップデート
ChatGPT の現状理解と 2023年7月版 LLM情報アップデートChatGPT の現状理解と 2023年7月版 LLM情報アップデート
ChatGPT の現状理解と 2023年7月版 LLM情報アップデート
 
Html5概要 & デモ
Html5概要 & デモHtml5概要 & デモ
Html5概要 & デモ
 
Mautic Meetup Tokyo #3 データベース不要CMS:Gravの紹介
Mautic Meetup Tokyo #3 データベース不要CMS:Gravの紹介Mautic Meetup Tokyo #3 データベース不要CMS:Gravの紹介
Mautic Meetup Tokyo #3 データベース不要CMS:Gravの紹介
 
Deeplinkから考えるWebとAppの今後とは
Deeplinkから考えるWebとAppの今後とはDeeplinkから考えるWebとAppの今後とは
Deeplinkから考えるWebとAppの今後とは
 
2013.01.18 G*Workshop GGX 2012 Report
2013.01.18 G*Workshop GGX 2012 Report2013.01.18 G*Workshop GGX 2012 Report
2013.01.18 G*Workshop GGX 2012 Report
 
Mixed Reality Toolkit V2.4.0の機能 ~ Progress Indicator ~
Mixed Reality Toolkit V2.4.0の機能 ~ Progress Indicator ~Mixed Reality Toolkit V2.4.0の機能 ~ Progress Indicator ~
Mixed Reality Toolkit V2.4.0の機能 ~ Progress Indicator ~
 
Deeplinkから考えるWebとAppの今後とは
Deeplinkから考えるWebとAppの今後とはDeeplinkから考えるWebとAppの今後とは
Deeplinkから考えるWebとAppの今後とは
 
HTML5開発最前線
HTML5開発最前線HTML5開発最前線
HTML5開発最前線
 
WebRTC NextVersion時代のJavaScript開発
WebRTC NextVersion時代のJavaScript開発WebRTC NextVersion時代のJavaScript開発
WebRTC NextVersion時代のJavaScript開発
 
第8回 業開中心会議 LT 「User Agent の 変遷」
第8回業開中心会議 LT 「User Agent の 変遷」第8回業開中心会議 LT 「User Agent の 変遷」
第8回 業開中心会議 LT 「User Agent の 変遷」
 
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
 
Airflow 2.0 migration ガイド
Airflow 2.0 migration ガイドAirflow 2.0 migration ガイド
Airflow 2.0 migration ガイド
 
〜Apache Geode 入門 gfsh によるクラスター構築・管理
〜Apache Geode 入門 gfsh によるクラスター構築・管理〜Apache Geode 入門 gfsh によるクラスター構築・管理
〜Apache Geode 入門 gfsh によるクラスター構築・管理
 
Git 20100313
Git 20100313Git 20100313
Git 20100313
 
VSCodeで始めるAzure Static Web Apps開発
VSCodeで始めるAzure Static Web Apps開発VSCodeで始めるAzure Static Web Apps開発
VSCodeで始めるAzure Static Web Apps開発
 
Rootage.co.jp技術共有
Rootage.co.jp技術共有Rootage.co.jp技術共有
Rootage.co.jp技術共有
 
【17-E-2】Ruby PaaS「MOGOK」 ~ ソフトウェアエンジニアのためのクラウドサービス ~ 藤原秀一氏
【17-E-2】Ruby PaaS「MOGOK」 ~ ソフトウェアエンジニアのためのクラウドサービス ~ 藤原秀一氏【17-E-2】Ruby PaaS「MOGOK」 ~ ソフトウェアエンジニアのためのクラウドサービス ~ 藤原秀一氏
【17-E-2】Ruby PaaS「MOGOK」 ~ ソフトウェアエンジニアのためのクラウドサービス ~ 藤原秀一氏
 
Operator reading and writing ( Operator SDK 編 )
Operator reading and writing ( Operator SDK 編 )Operator reading and writing ( Operator SDK 編 )
Operator reading and writing ( Operator SDK 編 )
 
安全な"○○でログイン"の作り方 @ NDS in Niigata #1
安全な"○○でログイン"の作り方 @ NDS in Niigata #1安全な"○○でログイン"の作り方 @ NDS in Niigata #1
安全な"○○でログイン"の作り方 @ NDS in Niigata #1
 

More from cch-robo

Introduction_on_designing_test_in_flutter
Introduction_on_designing_test_in_flutterIntroduction_on_designing_test_in_flutter
Introduction_on_designing_test_in_fluttercch-robo
 
Google I/O 2021 Flutter 全体報告
Google I/O 2021 Flutter 全体報告Google I/O 2021 Flutter 全体報告
Google I/O 2021 Flutter 全体報告cch-robo
 
Dart / Flutter コードファイルジェネレート入門
Dart / Flutter コードファイルジェネレート入門Dart / Flutter コードファイルジェネレート入門
Dart / Flutter コードファイルジェネレート入門cch-robo
 
フラッター開発におけるシークレット情報取扱考察
フラッター開発におけるシークレット情報取扱考察フラッター開発におけるシークレット情報取扱考察
フラッター開発におけるシークレット情報取扱考察cch-robo
 
Flutterを体験してみませんか
Flutterを体験してみませんかFlutterを体験してみませんか
Flutterを体験してみませんかcch-robo
 
Dart言語の進化状況
Dart言語の進化状況Dart言語の進化状況
Dart言語の進化状況cch-robo
 
明示的アニメで、Flutterアニメーション入門
明示的アニメで、Flutterアニメーション入門明示的アニメで、Flutterアニメーション入門
明示的アニメで、Flutterアニメーション入門cch-robo
 
DartPad+CodePenで、Flutterを体験してみよう
DartPad+CodePenで、Flutterを体験してみようDartPad+CodePenで、Flutterを体験してみよう
DartPad+CodePenで、Flutterを体験してみようcch-robo
 
Dartでサーバレスサービス
DartでサーバレスサービスDartでサーバレスサービス
Dartでサーバレスサービスcch-robo
 
Pin-point rebuildable and non-rebuild custom widget
Pin-point rebuildable and non-rebuild custom widgetPin-point rebuildable and non-rebuild custom widget
Pin-point rebuildable and non-rebuild custom widgetcch-robo
 
FlutterでのWidgetツリーへの状態伝播とアクセス制限の基本戦略
FlutterでのWidgetツリーへの状態伝播とアクセス制限の基本戦略FlutterでのWidgetツリーへの状態伝播とアクセス制限の基本戦略
FlutterでのWidgetツリーへの状態伝播とアクセス制限の基本戦略cch-robo
 
Before lunch オプションを使って Flutterでstaging/release環境を切り替える
Before lunch オプションを使って Flutterでstaging/release環境を切り替えるBefore lunch オプションを使って Flutterでstaging/release環境を切り替える
Before lunch オプションを使って Flutterでstaging/release環境を切り替えるcch-robo
 
Flutter のリアクティブ戦略 set state 〜 redux まで
Flutter のリアクティブ戦略 set state 〜 redux までFlutter のリアクティブ戦略 set state 〜 redux まで
Flutter のリアクティブ戦略 set state 〜 redux までcch-robo
 
Android lint-srp-practice
Android lint-srp-practiceAndroid lint-srp-practice
Android lint-srp-practicecch-robo
 
Loose and fluffy_ddd_intro
Loose and fluffy_ddd_introLoose and fluffy_ddd_intro
Loose and fluffy_ddd_introcch-robo
 
Firebase Test Lab 無料枠を使ってみました。
Firebase Test Lab 無料枠を使ってみました。Firebase Test Lab 無料枠を使ってみました。
Firebase Test Lab 無料枠を使ってみました。cch-robo
 
ZTE OPEN を日本語化(バージョンアップ)してみる
ZTE OPEN を日本語化(バージョンアップ)してみるZTE OPEN を日本語化(バージョンアップ)してみる
ZTE OPEN を日本語化(バージョンアップ)してみるcch-robo
 
FirefoxOSで学ぶJavaScript作法
FirefoxOSで学ぶJavaScript作法FirefoxOSで学ぶJavaScript作法
FirefoxOSで学ぶJavaScript作法cch-robo
 

More from cch-robo (18)

Introduction_on_designing_test_in_flutter
Introduction_on_designing_test_in_flutterIntroduction_on_designing_test_in_flutter
Introduction_on_designing_test_in_flutter
 
Google I/O 2021 Flutter 全体報告
Google I/O 2021 Flutter 全体報告Google I/O 2021 Flutter 全体報告
Google I/O 2021 Flutter 全体報告
 
Dart / Flutter コードファイルジェネレート入門
Dart / Flutter コードファイルジェネレート入門Dart / Flutter コードファイルジェネレート入門
Dart / Flutter コードファイルジェネレート入門
 
フラッター開発におけるシークレット情報取扱考察
フラッター開発におけるシークレット情報取扱考察フラッター開発におけるシークレット情報取扱考察
フラッター開発におけるシークレット情報取扱考察
 
Flutterを体験してみませんか
Flutterを体験してみませんかFlutterを体験してみませんか
Flutterを体験してみませんか
 
Dart言語の進化状況
Dart言語の進化状況Dart言語の進化状況
Dart言語の進化状況
 
明示的アニメで、Flutterアニメーション入門
明示的アニメで、Flutterアニメーション入門明示的アニメで、Flutterアニメーション入門
明示的アニメで、Flutterアニメーション入門
 
DartPad+CodePenで、Flutterを体験してみよう
DartPad+CodePenで、Flutterを体験してみようDartPad+CodePenで、Flutterを体験してみよう
DartPad+CodePenで、Flutterを体験してみよう
 
Dartでサーバレスサービス
DartでサーバレスサービスDartでサーバレスサービス
Dartでサーバレスサービス
 
Pin-point rebuildable and non-rebuild custom widget
Pin-point rebuildable and non-rebuild custom widgetPin-point rebuildable and non-rebuild custom widget
Pin-point rebuildable and non-rebuild custom widget
 
FlutterでのWidgetツリーへの状態伝播とアクセス制限の基本戦略
FlutterでのWidgetツリーへの状態伝播とアクセス制限の基本戦略FlutterでのWidgetツリーへの状態伝播とアクセス制限の基本戦略
FlutterでのWidgetツリーへの状態伝播とアクセス制限の基本戦略
 
Before lunch オプションを使って Flutterでstaging/release環境を切り替える
Before lunch オプションを使って Flutterでstaging/release環境を切り替えるBefore lunch オプションを使って Flutterでstaging/release環境を切り替える
Before lunch オプションを使って Flutterでstaging/release環境を切り替える
 
Flutter のリアクティブ戦略 set state 〜 redux まで
Flutter のリアクティブ戦略 set state 〜 redux までFlutter のリアクティブ戦略 set state 〜 redux まで
Flutter のリアクティブ戦略 set state 〜 redux まで
 
Android lint-srp-practice
Android lint-srp-practiceAndroid lint-srp-practice
Android lint-srp-practice
 
Loose and fluffy_ddd_intro
Loose and fluffy_ddd_introLoose and fluffy_ddd_intro
Loose and fluffy_ddd_intro
 
Firebase Test Lab 無料枠を使ってみました。
Firebase Test Lab 無料枠を使ってみました。Firebase Test Lab 無料枠を使ってみました。
Firebase Test Lab 無料枠を使ってみました。
 
ZTE OPEN を日本語化(バージョンアップ)してみる
ZTE OPEN を日本語化(バージョンアップ)してみるZTE OPEN を日本語化(バージョンアップ)してみる
ZTE OPEN を日本語化(バージョンアップ)してみる
 
FirefoxOSで学ぶJavaScript作法
FirefoxOSで学ぶJavaScript作法FirefoxOSで学ぶJavaScript作法
FirefoxOSで学ぶJavaScript作法
 

Recently uploaded

AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 

Recently uploaded (12)

AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 

go_router が隠してくれるもの

  • 1. go_router が隠してくれるもの Navigatorと Routerと これから 1 robo 【IWD2022】集え Flutter レディース
  • 3. はじめに go_routerは、v3.0.2 から Flutter package に移管され Flutterチームがメンテナンスするようになりました。 gorouter.dev の公式ドキュメントも、 これから docs.flutter.dev に移動するそうです。 ● gorouter.dev https://gorouter.dev/ ● docs.flutter.dev https://docs.flutter.dev/ 3 Chris Sells さんの移管報告ツイート (2022/02/25) https://twitter.com/csells/status/1496983180791873538
  • 4. 公式ドキュメントの移動は、まだのようですが、 リポジトリは Flutter package に移管済です。 バージョンも移管から 2ヶ月経過した、 現在(2022/04/20)では、3.0.7 まで進んでいます。 ● go_router (pub.dev) https://pub.dev/packages/go_router ● go_router changelog https://pub.dev/packages/go_router/changelog ● go_router repository https://github.com/flutter/packages/tree/main/packages/go_router ● go_router issue https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+go_router%22 4
  • 5. 5 Chris Sells さんの go_router リポジトリ (現在アーカイブとなり read-only になっています) https://github.com/csells/go_router Chris Sells さんの go_router リポジトリは、 アーカイブされました。 アーカイブに伴い、 Contributor toshi-kuji さん による邦訳ドキュメントも read-only になっています。
  • 6. おわび セッションでは、go_router の実装法について話しません。 ナビゲーションとルーティングの基本の確認となっています。 go_router の概要や使い方や具体例については、 Flutter package に移管されてからまだ日が浅いため、 邦訳された公式ドキュメントを一読するのが良いと思います。 注意)一部の移管前リソースを参照するリンクは、404になっています。 6
  • 8. go_router パッケージが目指すもの 宣言的ルートを使用して、以下の複雑さを軽減させること+α(意訳です) ● ディープリンクやダイナミックリンクの取り扱い ● そのほかのナビゲーション関連シナリオへの対応 ● これらのプラットフォーム① に依らない解決方法 ● 願わくば、使いやすい開発体験を提供すること。 ① iOS、Android、モバイル、ウェブ、 デスクトップ 8 go_router https://pub.dev/packages/go_router
  • 9. go_router パッケージが提供するもの 公式ドキュメント日本語版の目次より ● 宣言的なルーティング(Routing) ○ 遷移経路のルート定義の説明 ⇒ GoRouter.routes への GoRoute ツリー構造の登録 ● ナビゲーション ○ ページ間遷移の方法の説明 ⇒ GoRouter.go メソッドの使い方 ● パラメータ ○ クエリパラメータ定義の説明 ⇒ GoRoute.builder state 引数の使い方 ● サブルート ○ 遷移経路のサブツリー定義の説明 ⇒ GoRoute.routes への GoRoute ツリー構造の登録 9 go_router 公式ドキュメント日本語版の目次 https://zenn.dev/inari_sushio/scraps/01ef7604a4b934
  • 10. go_router パッケージが提供するもの ● リダイレクト ○ ページリダイレクト方法の説明 ⇒ GoRouter.redirect への GoRoute差替先の登録 ● 名前付きルート ○ パス特定識別名定義の説明 ⇒ GoRoute.name への パス識別名の登録 ● ユーザー入力フォーム ○ ページ間データ授受方法の説明 ⇒ GoRoute は呼出先からの返値を受け取れないので、   呼出先で呼出元オブジェクトに値を入れてもらう。 ● ネスト(入れ子)型ナビゲーション ○ アドレスバー対応の部分遷移の説明 ⇒ GoRoute.path と builder state を使った    同一ページパスのタブ別パラメータ定義 ● サンプルコード集 ○ go_router の具体的な使用方法のサンプル 10 これらは、 Navigator 2.0 の複雑さを隠してくれます。
  • 11. Navigator 2.0 とは何か(Navigator と Router) Navigation and routing では、 Flutterでは、ページ遷移の経路制御を行う、 命令型ルーティング (imperative routing mechanism) の Navigator ウィジェットと、 宣言型ルーティング (declarative routing mechanism) の Router ウィジェットがあることや Navigator API は、簡単なページ遷移に役立ち、 Router API は、より複雑なページ遷移に役立つことと そして、Router と宣言的ルーティングの学習資料として、 Learning Flutter’s new navigation and routing system が紹介されています。 11 Navigation and routing https://docs.flutter.dev/development/ui/navigation
  • 12. Navigator 2.0 とは何か(Navigator と Router) Learning Flutter’s new navigation and routing system では、 新しくなった Navigator API と 新たに追加された Router API を使って、 ページ遷移の制御や、ルート (遷移経路) の解析をより細かくする方法が、 Navigator 2.0 だと説明されています。 Navigator 2.0 は、複数のページをプッシュまたはポップしたり、 現在のページの下にあるページを削除したりするこができますが、 既存の方法のまま Navigator API を使い続けることもできるとあります。 12 Learning Flutter’s new navigation and routing system https://medium.com/flutter/learning-flutters-new-navigation-and-routing-system-7c9068155ade
  • 13. Navigator 1.0 とは Navigator 1.0 は、Navigator と Route を利用した旧来のページ遷移法です。 ● Navigator Route (起点) オブジェクトのスタックを管理するウィジェット ● Route 画面ウィジェットツリーのルート (起点) を表すウィジェット 一般的には、MaterialPageRoute が利用される。 ● Route (起点) オブジェクトを Navigator.push で直接 生成するか、 MaterialApp.routes に名前付きの Builder を定義 (Named routes) するかして、 Navigator のスタックに push/pop で出し入れしてページ遷移を行います。 13
  • 14. Navigator 1.0 とは 通常 Navigator は、アプリに1つ (MaterialApp にバインドされる) であり、 その Navigator オブジェクトに push/pop により、 Route をスタックに出し入れさせる命令型ルーティングを行います。 仕組みが単純で扱い易いのですが、 画面を任意で積み上げ取り去りできるので、 現在の画面がどのような経路で積み上げられ た(遷移してきた)のかを知るには、独自の履歴 管理が必要です。 14
  • 15. Navigator 2.0 とは Navigator 2.0 は、Page、Router、RouteInformationParser、RouterDelegate、 BackButtonDispatcher を利用した新しいページ遷移と経路制御管理法です。 ● Page Navigator の遷移履歴スタック(pages) で管理される不変のオブジェクト。 ● Router Navigator が遷移を表現できるよう Page の遷移履歴スタックを構成します。 Page の遷移履歴スタックは、基盤となるプラットフォームまたは アプリの状態の変化に基づいて変化します。 15
  • 16. Navigator 2.0 とは ● RouteInformationParser RouteInformationProvider から取得した RouteInformation が、 どの遷移パスに対応するデータかを解析します。 ● RouterDelegate Router がアプリ固有のページ遷移挙動を行えるよう、 検出したアプリの状態変化に応じた Router への通知をおこないます。 そのために、RouteInformationParser とアプリの状態および、 Navigator が持つ Page の遷移履歴スタックの再構築を監視します。 ● BackButtonDispatcher 戻るボタンの押下を RouterDelegate ⇒ Router に通知します。 16
  • 17. Navigator 2.0 とは 17 【参考】Flutter2の新しい画面遷移「Navigator 2.0」を使ったページ遷移を理解しよう   https://codezine.jp/article/detail/14532 Page、Router、RouteInformationParser、 RouterDelegate、BackButtonDispatch の相互作用例
  • 18. go_router が隠していたもの 「go_router が提供するもの」で紹介した機能は、  前ページまでに登場した Navigator 2.0 を使うための要素 … Navigator、遷移履歴スタック、遷移パス、Page、 Router、RouteInformationParser、RouteInformationProvider、 RouteInformation、RouterDelegate、BackButtonDispatcher を隠し、  GoRouter と GoRoute で機能を提供してくれていたようです。 18
  • 19. Navigator 2.0 の背景を学ぶ Flutter Design Documents には、 様々な仕様提案が公開されています。 その中には、Router API についての提案があります。 ドキュメントでは、Navigator 2.0 が必要になる 背景や解決案について述べられています。 Introduce a declarative API to set the history stack of the Navigator and a new Router widget to configure the Navigator based on app state and system events. 19 Router (PUBLICLY SHARED) https://docs.google.com/document/d/1Q0jx0l4-xymph9O6zLaOY4d_f7YFpNWX_eGbzYxr9wY/edit 紹介のみ
  • 21. go_router のこれから go_router が、Flutter package に 移管されてから2ヶ月が経ち... Flutter Design Documents に go_router が、これから どこに向かうのかを示唆する 仕様提案が今月追加されました。 go-router-improvements 21 GoRouter API improvements (PUBLICLY SHARED) https://docs.google.com/document/d/1_mRXinbL_rb0mUt6DAFZ8kj0kh33ZjEMJuUq4PJgwj8/edit
  • 22. go_router のこれから ドキュメントでは、 ● GoRouterは、 Router ウィジェットに基づいた簡略化された API を提供してくれますが ● 現在 GoRouter には、 Focus issues、Absolute paths、Shell UI、Redirection という 課題がある ことと ● StackedRoute、NavigatorRoute、 ShellRoute +(preserveState パラメータ)、RouteState という 新規 API が提案 されています。 22
  • 23. Absolute paths 課題 GoRouter は、相対パスへのナビゲートをサポートしていません。 例えば、HomeScreen と Ascreen があるとして、 ページ遷移の構成が HomeScreen ⇒ Ascreen とするので、 GoRouteの routes を使ってパスの入れ子構造① を作れても、 go('/home') の次は、go(’/home/a’) のように絶対パスの使用を強制します。 ① GoRouter(routes: [ GoRoute(path: '/home', routes: [ GoRoute(path: 'a' routes: []), ), ), 23
  • 24. Focus issues 課題 GoRouteの外側に Scafold を生成させるとフォーカスに課題があります。 GoRouter コンストラクタ引数の navigatorBuilder で、 GoRoute の周囲(外郭) に UI を構築させることができますが、 Scafold を構築させるとフォーカスの問題が発生する可能性がある課題 24
  • 25. Shell 課題 ここでの Shell は、子コンポーネントの周りに描画された UI を表す用語です。 Shell とは、子コンポーネントの周りに描画された UI のことですが、 遷移描画ウィジェットにとって、自分の外側(外郭) に親UIが存在するため、 ナビゲーションで全画面再構築はしていないが、 ページ遷移なので、 アドレスバーなどでパスを変える必要が発生する課題です。 一般的な対象例として、 BottomNavigationBar、AdaptiveNavigationScaffold、 または TabBar が挙げられます。 25
  • 26. Redirection 課題 右のサンプルコードの内容は、 GoRouter に '/'で HomeScreen を定義し、 '/a'で Ascreen、'/b'で Bscreen を定義しています。 ここで Ascreen に HomeScreen へのリダイレクトを付け、 go('/a') を実行すると HomeScreen が表示されますが、 履歴バックさせても Ascreen には戻らないそうです。 これは、GoRouter のリダイレクト処理が、 最終的な経路パスの Route (ページ) のみ構築するからです。 この最適化により 端折られた途中経過のページ遷移は、 履歴に残るはずもないので、バックしても表示されません。 26 late final GoRouter _router = GoRouter( routes: <GoRoute>[ GoRoute( path: '/', builder: (context, state) => HomeScreen(), routes: <GoRoute>[ GoRoute( path: 'a', builder: (context, state) => AScreen(), redirect: (_) { return '/'; }, routes: <GoRoute>[ GoRoute( path: 'b', builder: (context, state) => BScreen(), ), ], ), ], ), ], redirect: (GoRouterState state) { return null; }, ); Issue #101183 GoRouterのリダイレクト動作に関するいくつかの問題 https://github.com/flutter/flutter/issues/101183
  • 27. 新規 API 提案 ● StackedRoute GoRoute を StackedRoute に改名し、 パスに一致するサブルートが 親の上にスタックされていることを明示するようにします。 ● NavigatorRoute 描画効率化のため 内部 Navigator を生成して、 パスに一致するサブルートを表示させる GoRoute 拡張版ウィジェットです。 27
  • 28. 新規 API 提案 ● ShellRoute 子Route の外郭となる 親Route に必要な対応として、 コンストラクタ引数 builder に追加の子パラメーターを提供する、 GoRoute 拡張版ウィジェットです。 ○ 追加されたパラメータは、 対応する 子Route の builder を呼び出せるようにします。 ○ 一致する 子Route がなかった場合、 このウィジェットは 幅と高さがゼロの SizedBox とします。 28
  • 29. 新規 API 提案 ● ShellRoute preserveState パラメータ ShellRoute に、サブルートの Widget を保持させるパラメータです。 Offstageウィジェットを使用してサブルートのウィジェットを保持します。 以前にアクティブだった Route オブジェクトも保存させます。 ● RouteState 相対ルートをサポートするためのオブジェクトです。 GoRouter に 「GoRoute builder を介して構築されたすべてのウィジェットに RouteState オブジェクトを提供する」ようにさせます。 29
  • 30. go_router のこれから go_router パッケージは、 Router ウィジェットに基づいた簡略化された API を提供して、 複雑さを隠蔽してくれています。 新規 API は、提案なので実現するか否かは現時点で不明です。 ですが、新規APIを必要とする課題 は存在しています。 go_router が 隠してくれない課題 があることを認識し、 課題を解決する一助になれたらと願います。 30