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

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

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

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

【问题讨论】:

    标签: flutter dart bloc flutter-state


    【解决方案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 有什么区别,因为你都用过,是不是很重要
    • 一个流用于发布事件,另一个用于发布事件。可以在没有两个的情况下进行设计,我发现有两个更符合“关注点分离”原则。
    猜你喜欢
    • 2020-07-23
    • 2017-11-29
    • 2021-04-26
    • 2020-10-14
    • 2012-11-05
    • 1970-01-01
    • 1970-01-01
    • 2017-11-09
    • 2016-02-25
    相关资源
    最近更新 更多