【发布时间】:2019-09-28 11:18:00
【问题描述】:
我正在尝试在 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);
}
【问题讨论】:
-
请不要在你的问题标题上附加标签名称,比如 Flutter,你在底部有标签来指示问题的目标。为什么调用 bloc.fetchLogin() 作为 StreamBuilder 的流属性的值?为什么不公开最终的 login_fetcher 属性并在 StreamBuilder 的流属性中使用它?