我有一个使用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),)
);
}
);
}
}