我正在尝试在Flutter上实现Bloc
,而我只是了解了此功能,但出现了错误:
错误:
引发了另一个异常:“ Future”类型不是“ Stream”类型的子类型
我的服务器返回此结构,我想用bloc
和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);
}
答案 0 :(得分:0)
您要提供一个Future对象,而不是StreamStream的stream
属性的流。
//...
StreamBuilder(
stream: bloc.fetchLogin(), // THIS LINE IS WRONG
由于默认情况下fetchLogin
是async
函数,因此async
方法在您的情况Future<void>
中始终返回Future对象。您应该将错误的行替换为:
//...
StreamBuilder(
stream: bloc.login,
然后在onPress
回调中进行fetchLogin()调用,而无需进行setState
调用。我不明白为什么你在那里有一个setState呼叫...