【问题标题】:Different type error when trying to access BLoC data in StreamBuilder尝试在 StreamBuilder 中访问 BLoC 数据时出现不同类型的错误
【发布时间】:2019-09-28 11:18:00
【问题描述】:

我正在尝试在 Flutter 上实现 Bloc,我刚刚了解了这个功能,但我得到了错误:

错误:

引发了另一个异常:类型“Future”不是类型“Stream”的子类型

我的服务器返回这个结构,我想用blocrxDart 得到它,例如:

[
    "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 的流属性中使用它?

标签: flutter rxdart


【解决方案1】:

您正在向 StreamBuilder 的 stream 属性提供 Future 对象而不是流。

//...
StreamBuilder(
        stream: bloc.fetchLogin(), // THIS LINE IS WRONG

由于您的fetchLogin 是一个async 函数,默认情况下async 方法在您的情况下总是返回一个Future 对象Future&lt;void&gt;。您应该将错误的行替换为:

 //...
    StreamBuilder(
            stream: bloc.login,

并在onPress 回调中调用 fetchLogin() 并且您不需要setState 调用。我不明白为什么你在那里有一个 setState 调用......

【讨论】:

  • 你能帮我解决这个问题吗? https://stackoverflow.com/q/56080076/1830228提前谢谢
猜你喜欢
  • 2019-10-23
  • 2020-07-30
  • 2016-04-19
  • 2018-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多