微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Flutter 如何获取 Provider 的值

如何解决Flutter 如何获取 Provider 的值

我的代码中有这个 Provider。它假设返回列表

class ServingProvider extends ChangeNotifier {
  List<Serving> servings = [];

  getServings() {
    Firestore.instance
        .collection('servings')
        .getDocuments()
        .then((value) => value.documents)
        .then((value) =>
            value.map((serving) => Serving.fromJson(serving.data)).toList())
        .then((value) => servings.addAll(value))
        .then((value) => notifyListeners());
    print(servings);
  }

  // List<Serving> get servings => servings;
}

我想在这里获取值,但由于某种原因我得到了 null。

class KMultiScrollWheel extends StatelessWidget {
  final String title;
  final String value;
  final BuildContext passedContext;
  final String dialogTitle;

  KMultiScrollWheel({
    @required this.title,this.value,@required this.passedContext,this.dialogTitle,});

  @override
  Widget build(BuildContext context) {
    final servings = Provider.of<ServingProvider>(context).servings;
    print(servings)

这是我班级的包装。

ChangeNotifierProvider(
                  create: (_) => ServingProvider(),child: KMultiScrollWheel(
                    title: 'Serving Size',passedContext: context,dialogTitle: 'Select Serving',),

我来自 React,我完全迷失了一些应该相当简单的东西。提前致谢。

最后一个问题,当我可以访问已经在顶部声明的服务时,使用 get 方法有什么意义。

解决方法

当您使用实时数据库时,请使用 StreamProvider 而不是 ChangeNotifierProvider ,此 medium article 可以帮助您

,

我是新手,无法发表评论,因为我不确定这是否可行,但我没有看到您调用 getServings 方法,所以您的列表可能还没有填满?

你可以尝试这样的事情:

final servingsProvider = Provider.of<ServingProvider>(context);
(await) servingsProvider.getServings(); //and make getServings() async since it connects to Firebase
print(servingsProvider.servings);

当然,你应该在未来或流构建器中处理它,以呈现它。

,

我认为 getServings 是一个 Future 函数,因此您必须处理 servings 为 null 的情况。您可以简单地在 ServingProvider 的构造函数中添加 getServings:

class ServingProvider extends ChangeNotifier {
  ServingProvider(){
    // call getServings in constructor,notify listener when servings update
    getServings();
  }
  ...

并自行处理KMultiScrollWheel build中的空服务

其他方式是FutureProvider(在数据未准备好时设置initialData)或StreamProvider

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。