我是flutter集团架构的新手。我有一个AuthBloc,它发出一个用户流。
现在,在我的一些较低级别的Bloc中,我需要访问用户的id,例如在UserProfile Bloc中。我无法决定哪种方法是最好的。
例如,我可以:
-
订阅区块的用户流,并在每次用户更改时激发一个newUserEvent。这可以很好地工作,但由于我必须订阅存储库中的用户配置文件编辑流,因此逻辑似乎很笨拙。
-
我想到的第二种方法是,当我在该路由的blocProvider中创建bloc时,通过将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变成了未来:
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(
我试图找到一种值得推荐的方法来处理这个问题,但我找不到任何坚定的意见。
第二个选项听起来最简单,但第一个选项听起来是正确的。
你在第一个选项中描述的只是简单的BLoC到BLoC的通信;笨拙";在这个解决方案中。你可以在blocklibraryGithubrepository中找到一些例子,例如:https://github.com/felangel/bloc/blob/master/examples/flutter_todos/lib/blocs/filtered_todos/filtered_todos_bloc.dart.
我不认为存在";官方的";解决方案,您只需要选择一个适合您的问题。