首页 > 解决方案 > 尝试在 StreamBuilder 中访问 BLoC 数据时出现不同类型的错误

问题描述

我正在尝试Bloc在 Flutter 上实现,我刚刚了解了这个功能,但我得到了错误:

错误:

引发了另一个异常:“Future”类型不是“Stream”类型的子类型

我的服务器返回这个结构,我想用blocand得到它rxDart,例如:

[
    "active"=> 1,
    "name"=> "MY NAME",
    "avatar"=> "http://www.sample.com/avatar.png",
    ...
]

我实现的Repository类:

class Repository {
  final userInformation = InstagramApiProviders();

  Future<UserInfo> userInfo() => userInformation.checkUserLogin();
}

LoginBlock班级

class LoginBlock{
  final _repository = Repository();
  final _login_fetcher = PublishSubject<UserInfo>();

  Observable<UserInfo> get login=>_login_fetcher.stream;

  fetchLogin() async{
    UserInfo userInfo = await _repository.userInfo();
    _login_fetcher.sink.add(userInfo);
  }

  dispose(){
    _login_fetcher.close();
  }
}

final bloc = LoginBlock();

单击查看实现的按钮:

onPressed: () {
  setState(() {
    if (_checkLoginInstagram()) {
      StreamBuilder(
        stream: bloc.fetchLogin(),
        builder: (context,
            AsyncSnapshot<UserInfo>
            snapshot) {
          if (snapshot.hasData) {
            parseResponse(snapshot);
          }
        },
      );
    }
  });
},

parseResponse方法:

void parseResponse(AsyncSnapshot<UserInfo> snapshot) {
  debugPrint(snapshot.data.avatar);
}

标签: flutterrxdart

解决方案


您提供的是 Future 对象,而不是streamStreamBuilder 的属性流。

//...
StreamBuilder(
        stream: bloc.fetchLogin(), // THIS LINE IS WRONG

由于默认情况下您fetchLogin是一个async函数,因此async在您的情况下,方法总是返回一个 Future 对象Future<void>。您应该将错误的行替换为:

 //...
    StreamBuilder(
            stream: bloc.login,

并在onPress回调中调用 fetchLogin() ,您不需要setState调用。我不明白为什么你在那里有一个 setState 调用......


推荐阅读