如何在颤动中从其他页面的块流中获取数据
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 美分 感谢分享给像我这样的新手!图书馆值得一试以上是关于如何在颤动中从其他页面的块流中获取数据的主要内容,如果未能解决你的问题,请参考以下文章