颤振 addAll 没有为 Iterable 定义

Posted

技术标签:

【中文标题】颤振 addAll 没有为 Iterable 定义【英文标题】:flutter addAll isn't defined for Iterable 【发布时间】:2022-01-21 00:04:37 【问题描述】:

对于第 22 行的以下问题,我需要您的帮助。 Flutter 说,“addAll 没有为 Iterable 定义”。我需要更改代码中的哪些内容,或者您​​需要其他信息吗?

import 'package:flutter/material.dart';
import 'package:MyApp/jsonApi/dataModels/dataModelPlaces.dart';
import 'package:MyApp/jsonApi/parsers/repositoryPlaces.dart';

class ShareAppScreen extends StatefulWidget 
  @override
  _ShareAppScreenState createState() => _ShareAppScreenState();


class _ShareAppScreenState extends State<ShareAppScreen> 
  //List<DataModelPlaces> _places = <DataModelPlaces>[];
  Iterable<DataModelPlaces> _places = <DataModelPlaces>[];
  Iterable<DataModelPlaces> _placesDisplay = <DataModelPlaces>[];

  bool _isPlacesLoading = false;

  @override
  void initState() 
    super.initState();
    fetchPlaces().then((pvalue) 
      setState(() 
        _isPlacesLoading = false;
        _places.addAll(pvalue); //<- here I have a problem that addAll isn't defined for Iterable
        _placesDisplay = _places;
        print('User display pin Records: $pvalue.data!.length');
        var i=0;
        while (i < pvalue.data!.length)
          print('User display Lat of $i: $pvalue.data![i].attributes!.latitude');
          print('User display Long of $i: $pvalue.data![i].attributes!.latitude');
          i++;
        
      );
    );
  

  List stocksList = [
    CompanyStocks(name: "Intel Corp", price: 56.96),
    CompanyStocks(name: "HP Inc", price: 32.43),
    CompanyStocks(name: "Apple Inc", price: 133.98),
    CompanyStocks(name: "Microsoft Corporation", price: 265.51)
  ];

  @override
  Widget build(BuildContext context) 
    return Scaffold(
      appBar: AppBar(
        title: Text('Users List $_places.length'),
      ),
      body: SafeArea(
        child: Container(

          child: ListView.builder(
            itemCount: stocksList.length,
            itemBuilder: (context, index) 
              return Card(
                child: Padding(
                  padding: EdgeInsets.all(10),
                  child: ListTile(
                    title: Text(
                      stocksList[index].name,
                        style: TextStyle(
                        fontSize: 20,
                      ),
                    ),
                    leading: CircleAvatar(
                      child: Text(
                        stocksList[index].name[0],
                        style: TextStyle(fontSize: 15, fontWeight: FontWeight.bold),
                      ),
                    ),
                    trailing: Text("\$ $stocksList[index].price"),
                  ),
                ),
              );
            ,
          ),
        ),
      ),
    );
  


class CompanyStocks 
  String name;
  double price;

  CompanyStocks(required this.name,required this.price);

最后,我需要一个 DataModelPlaces 的变量“_places”和“_placesDisplay”,我可以使用它们来代替正在工作但不是 _places / _placesDisplay 的列表“stocksList”

非常感谢

罗马

【问题讨论】:

Iterable 没有 addAll 方法。见api.dart.dev/stable/dart-core/Iterable-class.html。请改用List 【参考方案1】:

Iterable 没有.addAll您需要先将其转换为List,以便您可以向其中添加所有元素,例如:

更新:我的错。 toList() 将返回一个新列表!您应该尝试以下替代方法

// This wrong since it will return a new list (wrong)
// _places.toList().addAll(pvalue)

或者,您可以将定义更改为 List 而不是 Iterable

来自:

Iterable<DataModelPlaces> _places = <DataModelPlaces>[];
Iterable<DataModelPlaces> _placesDisplay = <DataModelPlaces>[];

收件人:

List<DataModelPlaces> _places = <DataModelPlaces>[];
List<DataModelPlaces> _placesDisplay = <DataModelPlaces>[];

更新:

如 cmets 中所述,您要确保 fetchPlaces 返回 Iterable 以便使用 _places.addAll(pvalue) 否则,如果它是单个对象,请使用 _places.add(pvaule)

【讨论】:

我已经尝试过了,但后来出现错误“无法将参数类型 'DataModelPlaces' 分配给 'Iterable' 的参数类型,还有其他建议吗? @SecurexpertsNETworkGoogle 错误到底发生在哪里?如果它发生在_places.addAll(pvalue),请确保pvalue(又名fetchPlaces)实际上给你一个Iterable 或一个List,但不是DataModelPlaces 的单个值。如果它是单个值,您可以简单地使用.add 而不是.addAll 我已经尝试了你的建议。可迭代 _places = [];可迭代 _placesDisplay = [];使用 fetchPlaces().then((pvalue) setState(() _places.toList().add(pvalue); _placesDisplay = _places; ); );但它没有填满 _places 数组。在 pvalue 中,整个数组都是可见的。还有其他建议吗? @SecurexpertsNETworkGoogle 是的,它不会因为toList() 正在生成一个新列表。执行我上面提到的替代方法(即将_places_placesDisplayIterable&lt;DataModelPlaces&gt; 更改为List&lt;DataModelPlaces&gt;)。然后可以去掉toList(),直接在_places后面加上pvalue比如_places.add(pvalue) 我已经更新了我的答案和我的混乱。

以上是关于颤振 addAll 没有为 Iterable 定义的主要内容,如果未能解决你的问题,请参考以下文章

Java集合Colleciton接口

颤振'LatLng'未定义

如何使用颤振创建自定义弹出菜单

如何在颤振中解析这个复杂的json

长时间打开后无法构建颤振项目

错误:未为颤振中的“FirebaseMessaging”类型定义“配置”方法