如何在不使用任何库的情况下在颤振中使用 bloc

Posted

技术标签:

【中文标题】如何在不使用任何库的情况下在颤振中使用 bloc【英文标题】:How to use bloc in flutter without using any library 【发布时间】:2020-09-06 22:56:44 【问题描述】:

我想用bloc pattern管理我的应用程序的状态,我在互联网上搜索并找到了很多主题,但我不想都使用third party libraries

那么是否有任何资源或示例可以帮助我们使用 bloc pattern 而无需依赖任何外部库,例如:bloc, flutter_bloc, rxdart

我只想使用flutter built-in 功能,而不是任何其他库。

【问题讨论】:

【参考方案1】:

这是我旧代码中的一个 sn-p,但我强烈建议使用 bloc 和 flutter_bloc,它删除了很多样板代码,它更安全且更广为人知,VSCode 插件也处理大量代码生成。

class VotesBloc 
  final List<VoteCount> voteGroups = []; // initial state

  // broadcasting stream so it can be used multiple times
  final _controlStateController = StreamController<List<VoteCount>>.broadcast();

  StreamSink<List<VoteCount>> get _incomingVote => _controlStateController.sink;

  Stream<List<VoteCount>> get outgoingVote => _controlStateController.stream;

  final _votesEventController = StreamController<VoteEvent>.broadcast();

  Sink<VoteEvent> get votesEventSink => _votesEventController.sink;

  VotesBloc() 
    _votesEventController.stream.listen(_mapValuesToState);
  

  void _mapValuesToState(VoteEvent event) 
    if (event is NewVoteEvent) 
      // handle this state
     else if (event is VoteChangedEvent) 
      // handle this state
    

    _incomingVote.add(voteGroups);
  

  void dispose() 
    _controlStateController.close();
    _votesEventController.close();
  


abstract class VoteEvent 
  final Vote _vote;

  VoteEvent(this._vote);


class NewVoteEvent extends VoteEvent 
  NewVoteEvent(Vote vote) : super(vote);


class VoteChangedEvent extends VoteEvent 
  VoteChangedEvent(Vote vote) : super(vote);


class VoteCount 
  final String value;

  int counter;
  List<Vote> votes;

  VoteCount(this.value, this.counter, this.votes);

和builder函数:

StreamBuilder<List<VoteCount>>(
  stream: votesBloc.outgoingVote,
  initialData: votesBloc.voteGroups,
  builder: (BuildContext context, AsyncSnapshot<List<VoteCount>> snapshot) 
    return Widget();
  
)

在外面使用 bloc:

votesBloc.votesEventSink.add(VoteChangedEvent(vote));

【讨论】:

哇,谢谢你的代码,你能分享你用过的这些课程的任何在线文档吗?为什么我不想要第三方库?因为我为他们工作的公司,他们从不建议我们使用第三方包,因为他们认为第三方包没有维护很长时间。 SinkStreamSink 有什么区别,因为你都用过,是不是很重要 一个流用于发布事件,另一个用于发布事件。可以在没有两个的情况下进行设计,我发现有两个更符合“关注点分离”原则。

以上是关于如何在不使用任何库的情况下在颤振中使用 bloc的主要内容,如果未能解决你的问题,请参考以下文章

如何在不需要自定义库的情况下在 Google Colabs 上使用 Selenium IDE,例如科拉?

如何在没有任何 vue 库的情况下在 vue 回调中获取 http 响应标头(axios)

我已经安装了 OpenCV C++。我可以在不重新安装库的情况下在 Python 中使用它的功能吗?

如何在不使用任何形式的查找表的情况下在 Swift for iOS 8 中列出(几乎)所有表情符号?

如何在不使用webView的情况下在Android应用程序中显示Web内容

如何在不打开任何对话框的情况下在 Facebook 上发布消息?