【问题标题】:How to get data from bloc stream from other page in flutter如何在颤动中从其他页面的块流中获取数据
【发布时间】:2021-10-15 11:09:10
【问题描述】:

我有这样的问题: 在 Splash Page 中,我签入 sharedpreference 以在登录成功时获取保存的令牌。如果我有令牌,我请求 Api 获取帐户信息并像这样移动到下一页:

 Future check() async {
    String _getToken = await splashBloc.getTokenFormSharedPref();
    if (_getToken=='0') {
      Navigator.of(context).pushReplacement(
          MaterialPageRoute(builder: (context) => LoginMain()));
    } else {
      splashBloc.getAccountInfo();
      Navigator.of(context).pushReplacement(
          MaterialPageRoute(builder: (context) => HomeScreenMain()));
    }
  }

这是 BLoC 类:

class SplashBloc extends BlocBase{

  String _getToken = '';
  Future<String> getTokenFormSharedPref() async{
    SharedPreferences prefs = await SharedPreferences.getInstance();
    _getToken = (prefs.getString('token') ?? '0');
    return _getToken;
  }

  final accountInfoController = new StreamController<Account>();
  Sink<Account> get accountInfoSink => accountInfoController.sink;
  Stream<Account> get accountInfoStream => accountInfoController.stream;

  Future getAccountInfo() async{
    Account account = await NetworkService().getAccountInfo2(_getToken);
    accountInfoSink.add(account);
    print('from splash: '+account.fullName);
  }
  @override
  void dispose() {
    accountInfoController.close();
  }

}

当我检查日志时,它完全请求成功,问题是我如何访问下一页 HomeScreenMain() 的流构建器中的数据? 感谢您的帮助!

【问题讨论】:

    标签: flutter dart bloc stream-builder


    【解决方案1】:

    您可以在 HomeScreenMain() 中声明一个变量,并将之前收到的数据发送到类构造函数,如下所示:

    HomeScreenMain() {
    final data;
    HomeScreenMain(this.data)
    
    //....
    }
    

    当你想调用这个小部件时,你可以将数据从块传递到这个小部件

    【讨论】:

    • 我知道你的想法,但是这个来自 api 请求的数据调用,如果我们声明,它绝对是一个数据实例,而不是那个数据。顺便说一句,谢谢
    • 您正在将数据添加到流接收器。因此,您可以通过将其设为全局或使用 bloc 提供程序来使用进入您的 bloc 流的数据。使全局更容易,因此您只需在 bloc 类的末尾创建一个 bloc 实例,如下所示: final bloc = SplashBloc();那么你就可以在任何地方使用你的区块和数据了。
    • 哦,是的,也许这是使用全局变量的正确方法。谢谢!
    • 如果你得到你的答案并且它起作用了,接受答案以关闭问题主题
    • 这是对的,我选择将 bloc 类声明为全局变量。在课堂上,我将控制器更改为 BehaviorSubject。非常感谢!
    【解决方案2】:

    您似乎对 BLoC 使用了一种非常基本的方法。不确定我的回答是否有帮助。

    但是如果你使用库flutter_bloc,那么你可以在下一页使用 ˋfinal bloc = context.read;

    这会在 Widget 树的上游查找此 bloc 类型的提供者并将其分配给 ˋbloc

    【讨论】:

    • 我没有使用 lib flutter_bloc 。我创建了自己的 bloc 来使用,因为我是一个新的学习者,所以我选择 sink 和 stream 以在使用库之前更深入
    • 我从去年开始,建议立即使用 flutter_bloc,因为它让事情变得更容易。查看 bloclibrary.dev 中的示例,在初始化 bloc 时使用依赖注入以使其更好地可测试等。只是我的 2 美分
    • 感谢分享给像我这样的新手!图书馆值得一试
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-17
    • 1970-01-01
    • 2016-12-05
    • 2021-06-21
    相关资源
    最近更新 更多