[英]Flutter Bloc event not triggering
我有一个在调用运行应用程序时初始化的块(EntriesBloc),以便应用程序中的每个小部件都可以访问它。 该集团正在从 Firestore 检索数据,因此在生成初始主页时,我将事件 (LoadRepository()) 添加到初始化我构建的 FireStoreRepo class 的集团。 此事件工作正常,但在该事件的处理程序中,我尝试将另一个事件添加到块中,该事件将从 firestore 中检索数据,以便我可以显示它。 该集团似乎没有触发此事件,即使从小部件树中的其他位置调用它也是如此。
谁能告诉我为什么这不起作用?
这是代码:在 main 中初始化块:
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp(
options: DefaultFirebaseOptions.currentPlatform,
);
final UserRepository userRepository = UserRepository();
runApp(
MultiBlocProvider(
providers: [
BlocProvider<EntriesBloc>(
create: (context) => EntriesBloc(
userRepository: userRepository,
)
)
],
child: App(userRepository: userRepository),
),
);
}
在 App 的主路由中调用 load firestore 事件:
class MainRouter extends StatelessWidget {
MainRouter({Key key, UserRepository userRepository})
: assert(userRepository != null),
userRepository = userRepository,
super(key: key);
final GlobalKey<NavigatorState> navigatorKey = GlobalKey();
final UserRepository userRepository;
@override
Widget build(BuildContext context) {
BlocProvider.of<EntriesBloc>(context)..add(LoadRepository());
return WillPopScope(
onWillPop: () async {
return !await navigatorKey.currentState.maybePop();
},
child: Navigator(
key: navigatorKey,
onGenerateRoute: generateRoute
),
);
}
}
条目块:
class EntriesBloc extends Bloc<EntriesEvent, EntriesState> {
EntriesBloc({
@required UserRepository userRepository,
}) : assert(userRepository != null),
_userRepository = userRepository,
super(null) {
on<LoadRepository>(_createRepositoryToState);
on<LoadEntries>(_loadEntriesToState);
on<LoadedEntries>(_emitEntriesAreLoadedToState);
}
final UserRepository _userRepository;
FirebaseEntriesRepository _entriesRepository;
EntriesState get initialState => const AwaitingAuthentication();
FutureOr<void> _createRepositoryToState(
LoadRepository event, Emitter<EntriesState> emit) async {
List<String> projectIds = await _userRepository.getUserProject();
User user = await _userRepository.getUser();
String userId = user.uid;
_entriesRepository = new FirebaseEntriesRepository();
emit(LoadedRepository());
add(LoadEntries());
}
// Automatically streams data from firestore
FutureOr<void> _loadEntriesToState(
LoadEntries event, Emitter<EntriesState> emit) async* {
print("LOADING ENTRIES TO STATE");
emit(EntriesLoading());
_entriesRepository.entries().listen((entries) {
add(LoadedEntries(entries));
});
}
您是否尝试过使用context.<yourbloc>read().add(yourblocevent)
?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.