flutter 使用BLOC处理用户对象更改的最佳方法

wvyml7n5  于 2023-08-07  发布在  Flutter
关注(0)|答案(3)|浏览(123)

我正在进入BLOC,我没有看到最好的方法,使我的User对象可以被来自多个BLOC的事件改变。
示例-假设我正在构建一个社交媒体应用程序
AuthBloc包含Sign up / Sign in事件,成功时发出带有User对象的状态,其中包含一些基本数据和帖子列表。
主屏幕读取该状态并显示来自用户对象的数据。
问题:
作为不同的BLOC的一部分-让我们说PostBloc -有与用户帖子的CRUD操作相关的事件。
这些事件中的每一个都改变User对象的“posts”List,因此它返回一个新的User对象,其中包含更新的posts列表。
这会产生一个问题,因为从AuthBloc返回的User状态是旧的,不再相关,因为PostBloc的状态返回的User与AuthBloc + new posts列表的数据相同。
这里最好的方法是什么?我试着查找不同的示例以及官方的Bloc示例,但它们似乎都不是很完整--它们都喜欢覆盖基本的身份验证流程,但实际上从来没有进一步讨论如何管理用户状态。
理想情况下,我想让它,使每个块可以更新用户对象的属性,但我看不到的方法,如果我们认为,一切都应该导致块事件和事件应该发出新的状态。

f0brbegy

f0brbegy1#

在BLOC上有两个状态。
https://bloclibrary.dev/#/blocnamingconventions:~:text =%E2%9C%85-,好,-sealed%20class%20CounterEvent
我认为你也应该更新Usebloc状态下的用户数据。我建议您使用SingleClass状态

shstlldc

shstlldc3#

我不同意你的说法,文件不是很完整。您有一个简单的块到块通信问题,在www.example.com的体系结构部分中非常具体地解决了这个bloclibary.dev

来自文档:

第一个月

final OtherBloc otherBloc;
  late final StreamSubscription otherBlocSubscription;

  BadBloc(this.otherBloc) {
    // No matter how much you are tempted to do this, you should not do this!
    // Keep reading for better alternatives!
    otherBlocSubscription = otherBloc.stream.listen((state) {
      add(MyEvent());
    });
  }

  @override
  Future<void> close() {
    otherBlocSubscription.cancel();
    return super.close();
  }
}

字符串
While the code above is error free (and even cleans up after itself), it has a bigger problem: it creates a dependency between two blocs.
Generally, sibling dependencies between two entities in the same architectural layer should be avoided at all costs, as it creates tight-coupling which is hard to maintain. Since blocs reside in the business logic architectural layer, no bloc should know about any other bloc.
Application Architecture Layers
A bloc should only receive information through events and from injected repositories (i.e., repositories given to the bloc in its constructor).
If you're in a situation where a bloc needs to respond to another bloc, you have two other options. You can push the problem up a layer (into the presentation layer), or down a layer (into the domain layer).
Connecting Blocs through Presentation You can use a BlocListener to listen to one bloc and add an event to another bloc whenever the first bloc changes.

class MyWidget extends StatelessWidget {
  const MyWidget({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return BlocListener<FirstBloc, FirstState>(
      listener: (context, state) {
        // When the first bloc's state changes, this will be called.
        //
        // Now we can add an event to the second bloc without it having
        // to know about the first bloc.
        BlocProvider.of<SecondBloc>(context).add(SecondEvent());
      },
      child: TextButton(
        child: const Text('Hello'),
        onPressed: () {
          BlocProvider.of<FirstBloc>(context).add(FirstEvent());
        },
      ),
    );
  }
}


The code above prevents SecondBloc from needing to know about FirstBloc, encouraging loose-coupling. The flutter_weather application uses this technique to change the app's theme based on the weather information that is received.
因此,在您的示例中,只需创建一个BlocListener<PostBloc>小部件,并在listener回调中,从AuthBloc触发一个事件,该事件通过该事件接收Posts的列表,并使用更新后的列表更新User对象。这样,在PostBloc的任何CRUD操作之后,User对象将自动更新。
我不推荐其他答案之一建议的观察者模式,因为a)它违背了库创建者推荐的模式,b)它比需要的更复杂。

相关问题