【问题标题】:Consumer returns empty List instead of actual data消费者返回空列表而不是实际数据
【发布时间】:2021-12-07 15:37:39
【问题描述】:

我正在使用提供程序包进行颤振。 https://pub.dev/packages/provider

在 Appstart 上,我使用以下提供程序:

late Future<List<Art>> art;
late Future<List<Music>> music;
late Future<List<Furniture>> furniture;
late Future<List<Clothing>> clothing;
late Future<List<Flower>> flowers;
late Future<List<Interieur>> interieur;
late Future<List<Collectible>> allCollectibles;

  @override
  void initState() {
    super.initState();
    art = getAllArts();
    music = getAllMusic();
    furniture = getAllFurniture();
    clothing = getAllClothing();
    flowers = getAllFlowers();
    interieur = getAllInterieur();

    allCollectibles = () async {
      return [
        ...await art,
        ...await music,
        ...await furniture,
        ...await clothing,
        ...await flowers,
        ...await interieur,
      ];
    }();
  }
  @override
  Widget build(BuildContext context) {
    timeDilation = 1;

    return FutureBuilder(
      future: settings,
      builder: (context, snapshot) {
        if (snapshot.connectionState != ConnectionState.done) {
          return Center(child: CircularProgressIndicator());
        }

        return FutureProvider<List<Collectible>>(
                    create: (context) => allCollectibles, initialData: [],
                  ),});

稍后,我使用这个消费者来检索它:

@override
  Widget build(BuildContext context) {
    return Consumer<List<Collectible>>(builder: (context, collectibles, child) {
      return sendCollectibleDataFull(collectibles),
    });
  }

方法sendCollectibleDataFull 中的列表有时存在有时不存在。 如果通话时为空,它将保持为空。

我已更新为 nullsafety,因此 initialData: [], 是强制性的。在此之前,我总是从中得到一份清单。

我可以告诉我的消费者/提供者在我检索数据之前等待数据吗?

【问题讨论】:

    标签: flutter flutter-provider


    【解决方案1】:

    您好@lellek,欢迎您。

    好的,有几件事我想指出。

    您正在使用带有 create 回调的默认 FutureProvider 构造函数,但实际上您提供的值已经存在。

            return FutureProvider<List<Collectible>>(
                        create: (context) => allCollectibles, initialData: [],
                      ),});
    

    如果您已经有一个值并且您没有使用 Provider 创建它,您应该使用 .value 构造函数。

    但是,您可以使用带有create 回调的默认构造函数并在那里完成所有工作,而不是让这个StatefulWidget 完成一些工作(除非您也只需要这些实例)。

    这未经测试,但应该看起来像这样:

    FutureProvider<List<Collectible>>(
      create: (context) async {
        /// get collectibles in parallel
        final List<List<Collectible>> results = await Future.wait([
          getAllArts(), 
          getAllMusic(), 
          getAllFurniture(), 
          getAllClothing(), 
          getAllFlowers(), 
          getAllInterieur(),
        ]);
    
        /// flatten the results
        final allCollectables = [for (final collectibles in results) ...collectibles];
    
        return allCollectables;
      }, 
      initialData: [],
    )
    

    我可以告诉我的消费者/提供者在我检索数据之前等待数据吗?

    不,关键是初始值,在本例中为 [],将从提供程序获得,并且当未来解决时,树将更新。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多