如何在颤动中从其他页面的块流中获取数据

Posted

技术标签:

【中文标题】如何在颤动中从其他页面的块流中获取数据【英文标题】: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() 的流构建器中的数据? 感谢您的帮助!

【问题讨论】:

【参考方案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 美分 感谢分享给像我这样的新手!图书馆值得一试

以上是关于如何在颤动中从其他页面的块流中获取数据的主要内容,如果未能解决你的问题,请参考以下文章

在颤动中从实时数据库中获取空值

如何从颤动的路径中获取音频元数据?

如何在颤动中直接将数据从 StreamBuilder 获取到 GridView 中?

在颤动中从服务器获取图像到gridview

从 Rust 中的多个音频流中并行获取相同大小的块

如何在颤动中从本地html文件中的链接开始新页面