尝试访问 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 这个结构,我想用 blocrxDart 得到它,例如:

[
    "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 调用...