注销时Flutter Firebase Analytics导航器观察者异常

时间:2019-10-29 18:50:46

标签: flutter firebase-analytics

我有一个使用flutter bloc来管理状态和存储库的大型应用程序。我已经集成了firebase_analytics库,并且正在使用flutter bloc的RepositoryProvider将其注入到我的小部件树中。

我有一个小部件,当用户的身份验证状态更改时,该小部件会自行重建(请参见下面的authentication.dart)。

所有功能均可按预期运行,但是,我注销(触发小部件Authentication的重建)时,我的应用程序崩溃,但出现以下异常

'package:flutter/src/widgets/navigator.dart': Failed assertion: line 1505 pos 14: 'observer.navigator == null': is not true.

app.dart

class App extends StatelessWidget {
  App({Key key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    NavigatorObserver analyticsObserver = RepositoryProvider.of<FirebaseAnalyticsRepository>(context).observer;

    return MaterialApp(
      onGenerateRoute: RouteGenerator.generateRoute,
      navigatorObservers: <NavigatorObserver>[analyticsObserver]
    );
  }
}

authentication.dart

class Authentication extends StatelessWidget {
  const Authentication({Key key}) : super(key: key);

  @override
  Widget build(BuildContext context) {

    return BlocBuilder<AuthenticationBloc, AuthenticationState>(
        builder: (BuildContext context, AuthenticationState state) {
          if (state is Uninitialized) {
            return SplashScreen();
          } else if (state is Authenticated) {
            return HomeScreen();
          } else {
            return LoginScreen();
          }
        },
      );
  }
}

firebase_analytics_repository.dart:

class FirebaseAnalyticsRepository {
  final FirebaseAnalytics analytics;
  String uid;
  FirebaseAnalyticsObserver observer;

  FirebaseAnalyticsRepository({@required this.analytics}){
    observer = FirebaseAnalyticsObserver(analytics: analytics);
  }
}

main.dart:

void main(){
  final AuthRepository authRepository = AuthRepository();
  return runApp(MyApp(authRepository: authRepository,));
}

class MyApp extends StatelessWidget {
  final AuthRepository authRepository;
  MyApp({@required this.authRepository});

  @override
  Widget build(BuildContext context) {
    return MultiRepositoryProvider(
      providers: [
        RepositoryProvider<AuthRepository>(
          builder: (context) => authRepository,
        ),
        RepositoryProvider<FirebaseAnalyticsRepository>(
          builder: (context) => FirebaseAnalyticsRepository(analytics: FirebaseAnalytics()),
        ),
      ],
      child: BlocProvider<AuthenticationBloc>(
        builder: (context) => AuthenticationBloc(authRepository: authRepository),
        child: App()
      )
    );
  }
}

route_generator.dart

class RouteGenerator {
  static Route<dynamic> generateRoute(RouteSettings settings) {

    final args = settings.arguments;

    switch(settings.name){

      case '/':
        return MaterialPageRoute(builder: (context) => Authentication());

      default:
        return _errorRoute('Bad navigation route');
    }
  }

  static Route<dynamic> _errorRoute(String errorText){
    return MaterialPageRoute(
      builder: (context){
        return Scaffold(
          appBar: AppBar(
            title: Text('Route Error'),
          ),
          body: Center(child: Text(errorText),)
        );
      }
    );
  }
}

0 个答案:

没有答案