尝试访问 StreamBuilder 中的 BLoC 数据时出现不同类型的错误
Different type error when trying to access BLoC data in StreamBuilder
我正在尝试在 Flutter 上实现 Bloc
,我刚刚了解到这个功能,但我收到错误消息:
错误:
Another exception was thrown: type 'Future' is not a subtype of type 'Stream'
我的服务器 return 这个结构,我想用 bloc
和 rxDart
得到它,例如:
[
"active"=> 1,
"name"=> "MY NAME",
"avatar"=> "http://www.sample.com/avatar.png",
...
]
我实现了 Repository
class :
class Repository {
final userInformation = InstagramApiProviders();
Future<UserInfo> userInfo() => userInformation.checkUserLogin();
}
LoginBlock
class
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);
}
您正在向 StreamBuilder 的 stream
属性 提供 Future 对象而不是流。
//...
StreamBuilder(
stream: bloc.fetchLogin(), // THIS LINE IS WRONG
因为你的 fetchLogin
默认是一个 async
函数 async
方法 returns 在你的情况下总是一个 Future 对象 Future<void>
。您应该将错误的行替换为:
//...
StreamBuilder(
stream: bloc.login,
并在 onPress
回调中调用 fetchLogin(),您不需要 setState
调用。我不明白为什么你在那里有一个 setState 调用...
我正在尝试在 Flutter 上实现 Bloc
,我刚刚了解到这个功能,但我收到错误消息:
错误:
Another exception was thrown: type 'Future' is not a subtype of type 'Stream'
我的服务器 return 这个结构,我想用 bloc
和 rxDart
得到它,例如:
[
"active"=> 1,
"name"=> "MY NAME",
"avatar"=> "http://www.sample.com/avatar.png",
...
]
我实现了 Repository
class :
class Repository {
final userInformation = InstagramApiProviders();
Future<UserInfo> userInfo() => userInformation.checkUserLogin();
}
LoginBlock
class
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);
}
您正在向 StreamBuilder 的 stream
属性 提供 Future 对象而不是流。
//...
StreamBuilder(
stream: bloc.fetchLogin(), // THIS LINE IS WRONG
因为你的 fetchLogin
默认是一个 async
函数 async
方法 returns 在你的情况下总是一个 Future 对象 Future<void>
。您应该将错误的行替换为:
//...
StreamBuilder(
stream: bloc.login,
并在 onPress
回调中调用 fetchLogin(),您不需要 setState
调用。我不明白为什么你在那里有一个 setState 调用...