✈️
AutoRoute NavigationRail
👤対象者
- auto_routeでサイドバーを作ってみたい人
- auto_route使ったことある人
- NavigationRailをどのようにして使うのか?
記事の内容
auto_routeでNavigationRailの実装をやってみたいと思った。しかし調べても情報が出てこないような🤔
作るしかないか💦
日本代1号。多分?
補足情報
zennで画面遷移のパッケージの本をご紹介しています。破壊的変更があれば修正するようにしています。参考までにどうぞ。
Version 9.0.0で破壊的変更が出たそうです。
今回使用するパッケージたち
ページを作成して破壊的変更があったルートを定義するファイルにRootStackRouter
を継承したルートのクラスを定義すれば解決できます。2ページ作成してサイドバーを表示するデモアプリを作成いたしました。
レイヤーはこんな感じで分けております。
screen
ディレクトリ配下に今回はUIに関係したファイルを作成いたしました。
タイムラインページ
import 'package:auto_route/auto_route.dart';
import 'package:flutter/material.dart';
()
class TimeLine extends StatelessWidget {
const TimeLine({super.key});
Widget build(BuildContext context) {
return const Scaffold(
body: Center(
child: Text("TimeLine"),
),
);
}
}
設定ページ
import 'package:auto_route/auto_route.dart';
import 'package:flutter/material.dart';
()
class SettingScreen extends StatelessWidget {
const SettingScreen({super.key});
Widget build(BuildContext context) {
return const Scaffold(
body: Center(
child: Text("SettingScreen"),
),
);
}
}
サイドバーを作成するページ。ここは情報がなかったもので思いつきで作った。
import 'package:auto_route/auto_route.dart';
import 'package:flutter/material.dart';
import 'package:worklab_dashboard/core/router.gr.dart';
()
class MainScreen extends StatelessWidget {
const MainScreen({super.key});
Widget build(BuildContext context) {
return AutoTabsRouter(
routes: const [
TimeLine(),
SettingRoute(),
],
transitionBuilder: (context, child, animation) {
return FadeTransition(opacity: animation, child: child);
},
builder: (context, child) {
final tabsRouter = AutoTabsRouter.of(context);
return Scaffold(
body: Row(
children: [
NavigationRail(
extended: false,
destinations: const [
NavigationRailDestination(
icon: Icon(Icons.timeline),
label: Text('Timeline'),
),
NavigationRailDestination(
icon: Icon(Icons.settings),
label: Text('Settings'),
),
],
selectedIndex: tabsRouter.activeIndex,
onDestinationSelected: (value) {
tabsRouter.setActiveIndex(value);
},
),
Expanded(child: child),
],
),
);
},
);
}
}
ルートの設定をする。ここは結構ハマった💦
go_router
も同じだけど変更入るたびに修正するのが大変だ。こんなもんいらんだろうといつも考えているのですが仕事では画面遷移のパッケージ入れるの強制されるので普段から勉強して覚えるしかないです😇
UIを作成した後にコマンドを実行するとルートのファイルが自動生成されるのでモジュールをインポートすればエラーは消えます。
route.dart
import 'package:auto_route/auto_route.dart';
import 'package:worklab_dashboard/core/router.gr.dart';
(replaceInRouteName: 'Screen|Page,Route')
class AppRouter extends RootStackRouter {
RouteType get defaultRouteType => const RouteType.material();
List<AutoRoute> get routes => [
AutoRoute(page: MainRoute.page, initial: true, children: [
AutoRoute(page: TimeLine.page),
AutoRoute(page: SettingRoute.page),
])
];
}
main.dart
で設定したらあとはビルドすれば動作するはず。
main.dart
import 'package:flutter/material.dart';
import 'package:worklab_dashboard/core/router.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
MyApp({super.key});
final _appRouter = AppRouter(); // auto_routeのrouterを追加
Widget build(BuildContext context) {
return MaterialApp.router(
// MaterialApp.routerに変更
routerConfig: _appRouter.config(), // auto_routeのrouterを追加
title: 'Flutter Demo',
theme: ThemeData(primarySwatch: Colors.blue),
);
}
}
感想
今回は、AutoRouteでNavigationRailを使ってみました。GoRouterは情報が多いのですがAutoRouteは少ない。普段からキャッチアップしているのですが気がついたら設定方法変わってるので毎日情報見ていないと破壊的変更がされてるのに気づかないですね💦
AutoRouteが🇯🇵増えてくれると嬉しいな✨
Discussion