🦔

【Flutter】久しぶりにgo_router触ったらエラーにハマった話

2023/12/19に公開
1

はじめに

go_routerはFlutterで開発する際に画面遷移を簡単に実装しやすくするパッケージですが、久しぶりに使用した際にエラーに遭遇したので書きます。

公式はこちら↓
https://pub.dev/packages/go_router

バージョン

  • Flutter 3.13.9
  • go_router ^12.1.3

エラー内容

ルーティングを設定してデバッグを行ったところ、次のようなエラーメッセージが表示されました。

══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
The following assertion was thrown building DefaultSelectionStyle:
'package:go_router/src/parser.dart': Failed assertion: line 64 pos 12: 'routeInformation.state !=
null': is not true.

The relevant error-causing widget was:
  MaterialApp
...

Simulatorだとこんな感じ

ググってみたが、記事を書いてる時点ではヒットせず。

結論

go_routerのバージョン違いによる書き方の違いでした。

sample.dart
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:go_router/go_router.dart';
import 'package:test_project/presentation/pages/home_screen.dart';
import 'package:test_project/presentation/pages/login_screen.dart';
import 'package:test_project/presentation/pages/settings_page.dart';

void main() {
  runApp(
    ProviderScope(
      child: const App(),
    ),
  );
}

class App extends ConsumerWidget {
  const App({super.key});

  
  Widget build(BuildContext context, WidgetRef ref) {
    final goRouter = ref.watch(goRouterProvider);

    return MaterialApp.router(
      title: 'Test Project',
+     routerConfig: goRouter,
-     routerDelegate: goRouter.routerDelegate,
-     routeInformationParser: goRouter.routeInformationParser,
    );
  }
}

final goRouterProvider = Provider<GoRouter>(
  (ref) {
    return GoRouter(
      initialLocation: '/home',
      routes: [
        GoRoute(
          path: '/login',
          builder: (context, state) => const LoginScreen(),
        ),
        GoRoute(
          path: '/home',
          builder: (context, state) => const HomeScreen(),
        ),
        GoRoute(
          path: '/settings',
          builder: (context, state) => const SettingsPage(),
        ),
      ],
    );
  },
);

ちなみに

ChatGPTさんに聞いてみても良い回答は得られませんでした。

最後に

公式サイトや公式のGithubを見る限りgo_routerはバージョンによってかなり書き方が変わってます。
Linterでエラーにしてくれるものもありますが、今回のようにエラーにならず、変わるスパンが早いと生成AIでも良い回答が得られないこともあります。
go_routerに限らずFlutterはまだまだ成長しているフレームワークですので、やはり公式のドキュメントを読むことが一番ですね。

再度公式はこちら↓
https://pub.dev/packages/go_router

Discussion

JboyHashimotoJboyHashimoto

go routerは進化するの早いので、riverpodみたいに公式を見るしかないですね。