颤振:类型 'List<dynamic>' 不是类型 'List<DropdownMenuItem<String>>' 的子类型

Posted

技术标签:

【中文标题】颤振:类型 \'List<dynamic>\' 不是类型 \'List<DropdownMenuItem<String>>\' 的子类型【英文标题】:flutter: type 'List<dynamic>' is not a subtype of type 'List<DropdownMenuItem<String>>'颤振:类型 'List<dynamic>' 不是类型 'List<DropdownMenuItem<String>>' 的子类型 【发布时间】:2020-03-04 07:35:58 【问题描述】:

在我的颤振应用程序中,我有一个下拉菜单,下面是我将数据加载到其中的方式。

Consumer<ProductsImpl>(
                  builder: (context, data, child) 
                    print("consumer running");

                    return DropdownButton(
                        hint: Text(
                          "Please Select          ",
                          style: TextStyle(
                            fontSize: 14,
                          ),
                        ),
                        items: data.geProductAndTypeList.map((info) 
                          return DropdownMenuItem(
                            child: new Text(info,
                                style: TextStyle(
                                  fontSize: 14,
                                )),
                            value: data,
                          );
                        ).toList(),
                        onChanged: (String newValue) 
                          setState(() 
                            _productdropDown = newValue;
                            print(newValue);
                          );
                        ,
                        value: _productdropDown);
                  ,
                ),

下面是你可以找到getProductAndTypeList的代码

class ProductsImpl with ChangeNotifier 
  NavLinks _navLinks = new NavLinks();

  List<FreshProducts> _freshProductList = [];

  List<String> _productAndTypeList = [];

  get geProductAndTypeList => _productAndTypeList;

  Future<void> geFreshProductsBySpecies(int id) async 
    try 
      var data = await http.get(_navLinks.getFreshProductsBySpecies(id));
      var jsonData = convert.json.decode(data.body).cast<Map<String, dynamic>>();
      _freshProductList = jsonData
          .map<FreshProducts>((json) => new FreshProducts.fromJson(json))
          .toList();

      print("Product sIZE: " + _freshProductList.length.toString());
     catch (error) 
      throw error;
    

    //notifyListeners();
  

  Future<void> buildProductAndTypeList(int speciesID) async

    print("asasas");

    for(int i=0; i < _freshProductList.length ; i++)
    
      if(_freshProductList[i].productSpecies.idproductSpecies == speciesID)
      
        String str = _freshProductList[i].productCategory.name + ", "+ _freshProductList[i].productType.type;

        if(!_productAndTypeList.contains(str))
        
          _productAndTypeList.add(str);
          print(str);
        
      
    

    notifyListeners();

  

当下拉菜单正在构建时,我会遇到以下错误。

[38;5;248m════════ Exception caught by widgets library ═══════════════════════════════════[39;49m
[38;5;244mThe following assertion was thrown building Consumer<ProductsImpl>(dirty, dependencies: [_DefaultInheritedProviderScope<ProductsImpl>]):[39;49m
type 'List<dynamic>' is not a subtype of type 'List<DropdownMenuItem<String>>'


[38;5;248mEither the assertion indicates an error in the framework itself, or we should provide substantially more information in this error message to help you determine and fix the underlying cause.
In either case, please report this assertion by filing a bug on GitHub:
  https://github.com/flutter/flutter/issues/new?template=BUG.md
[39;49m

[38;5;244mThe relevant error-causing widget was[39;49m
    [38;5;248mConsumer<ProductsImpl>[39;49m
[38;5;244mWhen the exception was thrown, this was the stack[39;49m
[38;5;248m#0      ProductUIState._buildForm.<anonymous closure>[39;49m
[38;5;248m#1      Consumer.buildWithChild[39;49m
[38;5;248m#2      SingleChildStatelessWidget.build[39;49m
[38;5;244m#3      StatelessElement.build[39;49m
[38;5;248m#4      SingleChildStatelessElement.build[39;49m
[38;5;244m...[39;49m
[38;5;248m════════════════════════════════════════════════════════════════════════════════[39;49m

我该如何解决这个问题?

【问题讨论】:

value: data, //这里你需要给一些字符串但是你给的是数据 @HussnainHaidar 那么你的解决方案是什么? 在字符串而不是数据中给出一些索引值。您可以从地图中获取索引。 也许可以试试这个值:data.indexOf(info).toString(), 【参考方案1】:

答案是为_productAndTypeList 创建一个自定义get 方法,并指定返回类型。当使用get geProductAndTypeList =&gt; _productAndTypeList; 时,它返回一个动态。

我做了下面的方法。

List<String> geProductAndTypeList()
  
    return _productAndTypeList;
  

【讨论】:

以上是关于颤振:类型 'List<dynamic>' 不是类型 'List<DropdownMenuItem<String>>' 的子类型的主要内容,如果未能解决你的问题,请参考以下文章

颤振无法分配参数类型'List<dynamic>'

错误颤振:List<dynamic> 不是 Map<String, dynamic> 类型的子类型

类型 'List<dynamic>' 不是类型 'Map<String, dynamic>' 的子类型在颤振应用程序中出现此错误

类型“List<dynamic>”不是“Map<String”类型的子类型,在颤振应用中是动态的

如何使用 StreamBuilder 消除颤振数据表错误“预期类型为 'List<DataRow>',但得到类型为 'List<dynamic>”的值之一?

颤振错误:预期类型为“FutureOr<List<dynamic>>”的值,但得到类型为“_JsonMap”的值之一