繁体   English   中英

Flutter Bloc 事件未触发

[英]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.

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