简体   繁体   English

Flutter Bloc 事件未触发

[英]Flutter Bloc event not triggering

I have a bloc (EntriesBloc) that gets initialised when calling run app so that it is accessible to every widget within the app.我有一个在调用运行应用程序时初始化的块(EntriesBloc),以便应用程序中的每个小部件都可以访问它。 The bloc is retrieving data from Firestore, and so when generating the initial homepage I add the event (LoadRepository()) to the Bloc which initialises the FireStoreRepo class I built.该集团正在从 Firestore 检索数据,因此在生成初始主页时,我将事件 (LoadRepository()) 添加到初始化我构建的 FireStoreRepo class 的集团。 This event works fine, but within the handler of that Event I try to add another event to the bloc which will retrieve the data from within firestore so that I can display it.此事件工作正常,但在该事件的处理程序中,我尝试将另一个事件添加到块中,该事件将从 firestore 中检索数据,以便我可以显示它。 The bloc doesn't seem to be triggering this event, even when calling it from other places within the widget tree.该集团似乎没有触发此事件,即使从小部件树中的其他位置调用它也是如此。

Can anyone tell me why this isn't working?谁能告诉我为什么这不起作用?

Here is the code: Initialising the blocs within main:这是代码:在 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),
    ),
  );
}

Calling the load firestore event within the main router of App:在 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
      ),
    );
  }
}

Entries bloc:条目块:

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));
    });
  }

Have you tried using context.<yourbloc>read().add(yourblocevent) ?您是否尝试过使用context.<yourbloc>read().add(yourblocevent)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM