尝试在StreamBuilder中访问BloC数据时出现不同类型的错误

时间:2019-05-10 14:13:15

标签: flutter rxdart

我正在尝试在Flutter上实现Bloc,而我只是了解了此功能,但出现了错误:

错误:

  

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

我的服务器返回此结构,我想用blocrxDart来获得它,例如:

[
    "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);
}

1 个答案:

答案 0 :(得分:0)

您要提供一个Future对象,而不是StreamStream的stream属性的流。

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

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

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

然后在onPress回调中进行fetchLogin()调用,而无需进行setState调用。我不明白为什么你在那里有一个setState呼叫...