0

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

那么是否有任何资源或示例可以帮助我们在bloc pattern不依赖任何外部库的情况下使用,例如:bloc, flutter_bloc, rxdart

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

4

1 回答 1

2

这是我旧代码的一个片段,但我强烈建议使用 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});
}

和建设者功能:

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

在外面使用 bloc:

votesBloc.votesEventSink.add(VoteChangedEvent(vote));
于 2020-05-20T16:58:42.747 回答