【问题标题】:Flutter Bloc - How to correctly use parameters in blocFlutter Bloc - 如何正确使用 bloc 中的参数
【发布时间】:2021-06-17 10:00:30
【问题描述】:

我是 Flutter bloc 架构的新手。 我有一个发出用户流的 AuthBloc。

现在,在我的一些较低级别的块中,我需要访问用户的 id,例如在 UserProfile 块中。 我无法决定哪种方法最好。

例如我可以:

  • 订阅集团的用户 Stream 并在每次用户更改时触发 newUserEvent。这可以很好地工作,但由于我必须从存储库订阅用户配置文件编辑流,因此逻辑似乎很笨拙。

  • 我想到的第二种方法是当我在该路由的 blocProvider 中创建它时,通过将 UserId 作为参数传递来实例化 bloc,例如将其作为路由参数传递。

    class UserBloc extends Bloc<UserEvent, UserState> {
      final String userId;
      final UserRepository _userRepository;
      StreamSubscription? _userDetailsSubscription;
    
      UserBloc(this.userId, this._userRepository) : super(UserState.loading()) {
        _userRepository.getUserDetails(userId).listen((userDetails) {
            add(UserDetailsChanged(userDetails));
          })
            ..onError(
  • 最后,我还可以假设在实例化 UserBloc 时用户已经通过身份验证,我可以从 userRepository 中检索 authRepository 用户流的最后一个值。我可能最喜欢这种方法,但缺点是我的 userDetails 的 streamSubscription 变成了 Future :
class UserBloc extends Bloc<UserEvent, UserState> {
     final UserRepository _userRepository;
     StreamSubscription? _userDetailsSubscription;

     UserBloc(this._userRepository) : super(UserState.loading()) {
       _userRepository.getUserDetails().then((stream) {
         _userDetailsSubscription = stream.listen((userDetails) {
           add(UserDetailsChanged(userDetails));
         })
           ..onError(

我试图找到推荐的方法来解决这个问题,但我找不到任何坚定的意见。

【问题讨论】:

    标签: flutter dart stream bloc clean-architecture


    【解决方案1】:

    第二个选项听起来最简单,但第一个听起来是正确的。

    您在第一个选项中描述的只是简单的 BLoC 到 BLoC 通信,我没有看到此解决方案中的“笨拙”。您可以在 bloc 库 Github 存储库中找到一些示例,例如:https://github.com/felangel/bloc/blob/master/examples/flutter_todos/lib/blocs/filtered_todos/filtered_todos_bloc.dart

    我认为没有“官方”解决方案,您只需要选择适合您问题的解决方案即可。

    【讨论】:

      猜你喜欢
      • 2019-08-22
      • 2020-09-19
      • 2019-05-20
      • 2021-03-19
      • 2020-05-06
      • 2020-04-28
      • 2020-03-27
      • 2021-03-15
      • 2020-12-06
      相关资源
      最近更新 更多