【问题标题】:Using AutoRoute 2.2.0 with Bloc MultiBlocProvider将 AutoRoute 2.2.0 与 Bloc MultiBlocProvider 一起使用
【发布时间】:2021-09-27 22:39:23
【问题描述】:

我正在学习 ResoCoder 的优秀 DDD Flutter 课程,但我正在尝试使用最新的 pubspecs 将代码更新为空安全。 https://youtu.be/7qMADWW4gts

我遇到了最新版本的 AutoRoute 的问题,自 1.0 版以来,它不再具有 ExtendedNavigator 类。

来自 app_widget.dart 中的课程,Matt 有以下代码:

class AppWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MultiBlocProvider(
      providers: [
        BlocProvider(
          create: (context) =>
              getIt<AuthBloc>()..add(const AuthEvent.authCheckRequested()),
        )
      ],
      child: MaterialApp(
        title: 'Notes',
        debugShowCheckedModeBanner: false,
        builder: ExtendedNavigator.builder(router: app_router.Router()),
        theme: ThemeData.light().copyWith(
          primaryColor: Colors.green[800],
          accentColor: Colors.blueAccent,
          floatingActionButtonTheme: FloatingActionButtonThemeData(
            backgroundColor: Colors.blue[900],
          ),
          inputDecorationTheme: InputDecorationTheme(
            border: OutlineInputBorder(
              borderRadius: BorderRadius.circular(8),
            ),
          ),
        ),
      ),
    );
  }
}

我遇到的问题是,自 null 安全版本 1.0 以来,AutoRoute 中不再存在 ExtendedNavigator 类。我希望能够使用 Bloc 模式进行状态管理,但不知道如何将其连接到 AutoRoute,如 DDD 课程中所述。

builder: ExtendedNavigator.builder(router: app_router.Router()),

auto_route 包页面上的示例代码告诉我按如下方式连接路由器:

final _appRouter = AppRouter()  
   ...  
  Widget build(BuildContext context){  
      return MaterialApp.router(  
             routerDelegate: _appRouter.delegate(...initialConfig),  
             routeInformationParser: _appRouter.defaultRouteParser(),  
         ),  
  }  

由于 MaterialApp 是 MultiBlocProvider 的子对象,我不知道如何访问 MaterialApp.router,如 auto_route 示例中所述。

【问题讨论】:

    标签: flutter dart bloc flutter-routes


    【解决方案1】:

    注册第三方类型是我的解决方案。

    https://pub.dev/packages/injectable#Registering-third-party-types

    import 'package:injectable/injectable.dart';
    
    @module
    abstract class RegisterModule {
      @singleton
      AppRouter get router  =>  AppRouter();
    }
    

    然后就可以像这样使用getIt访问AppRouter了

    getIt<AppRouter>()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-24
      • 2020-10-06
      • 2013-08-21
      • 1970-01-01
      • 2011-04-03
      • 2017-05-24
      • 1970-01-01
      • 2020-04-26
      相关资源
      最近更新 更多