【问题标题】:Flutter How to get the value of a Provider outFlutter 如何将 Provider 的价值取出来
【发布时间】:2021-04-25 10:12:00
【问题描述】:

我的代码中有这个 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 方法有什么意义。

【问题讨论】:

    标签: flutter provider flutter-provider


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      你可以试试这样的:

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

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

      【讨论】:

        【解决方案3】:

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

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

        并自行处理KMultiScrollWheel build 中的null case

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

        【讨论】:

          猜你喜欢
          • 2020-03-13
          • 2020-07-19
          • 2020-07-30
          • 2021-06-28
          • 2020-01-27
          • 2020-08-12
          • 2021-07-22
          • 2021-06-07
          • 2023-02-07
          相关资源
          最近更新 更多