flutter - 尝试在 StreamBuilder 中访问 BLoC 数据时出现不同类型的错误
问题描述
我正在尝试Bloc
在 Flutter 上实现,我刚刚了解了这个功能,但我得到了错误:
错误:
引发了另一个异常:“Future”类型不是“Stream”类型的子类型
我的服务器返回这个结构,我想用bloc
and得到它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);
}
解决方案
您提供的是 Future 对象,而不是stream
StreamBuilder 的属性流。
//...
StreamBuilder(
stream: bloc.fetchLogin(), // THIS LINE IS WRONG
由于默认情况下您fetchLogin
是一个async
函数,因此async
在您的情况下,方法总是返回一个 Future 对象Future<void>
。您应该将错误的行替换为:
//...
StreamBuilder(
stream: bloc.login,
并在onPress
回调中调用 fetchLogin() ,您不需要setState
调用。我不明白为什么你在那里有一个 setState 调用......
推荐阅读
- scala - Scala - 一步计算两个变量
- vba - Excel VBA复制并粘贴到最后一行
- ruby-on-rails - 根据控制器中的 JSON API 响应 JSON
- hyperledger-fabric - 超级账本结构先前的哈希知道
- java - 无法在 Spring Boot 应用程序中设置 hystrix 仪表板
- nginx - 使用自定义日志格式时,nginx 变量为空
- elixir - 使用管道运算符检查布尔条件?
- angular - Angular,错误 TS2339:“响应”类型上不存在属性“任务”
- posix - POSIX:perror() - “MT-Safe race:stderr”是什么意思?
- node.js - Express.js CRUD 应用程序无法删除