【问题标题】:flutter addAll isn't defined for Iterable颤振 addAll 没有为 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”

非常感谢

罗马

【问题讨论】:

标签: json flutter datamodel


【解决方案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)
  • 我已经更新了我的答案和我的混乱。
猜你喜欢
  • 1970-01-01
  • 2021-05-12
  • 1970-01-01
  • 2020-11-05
  • 2022-01-17
  • 2020-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多