无法推断类型参数“T”

Posted

技术标签:

【中文标题】无法推断类型参数“T”【英文标题】:Couldn't infer type parameter 'T' 【发布时间】:2021-06-18 05:00:45 【问题描述】:

试图为不起作用的“T”推断“动态”:

参数 'onChanged' 声明为 'void Function(T?)?' 但参数是'void Function(Object?)'。

“动态”类型推断自:

参数 'value' 声明为 'T?' 但参数是“字符串”。 参数 'items' 声明为 'List?' 但参数是'List'。

考虑将显式类型参数传递给泛型。

我有显示上述问题的 DropDownformfield 代码是

SizedBox(
                    width: deviceWidth * .9,
                    height: deviceHeight * 0.15,
                    child: DropdownButtonFormField(
                      value: _dropDownValue,
                      dropdownColor: Colors.blueAccent,
                      iconSize: deviceWidth * .05,
                      icon: Icon(
                        Icons.arrow_drop_down_circle,
                        color: Colors.white,
                      ),
                      style: TextStyle(
                        color: Colors.black,
                        fontFamily: 'Constantia',
                        fontSize: 18.0,
                      ),
                      autovalidateMode: AutovalidateMode.always,
                      decoration: InputDecoration(
                        enabled: true,
                        border: OutlineInputBorder(
                          borderSide: BorderSide(
                            color: Colors.red,
                            width: 2,
                            style: BorderStyle.solid,
                          ),
                        ),
                      ),
                      onChanged: (value) 
                        setState(() 
                          _dropDownValue = value.toString();
                          print(_dropDownValue);
                        );
                      ,
                      items: <DropdownMenuItem<dynamic>>[
                        menuItem('none'),
                        menuItem('10'),
                        menuItem('20'),
                        menuItem('30'),
                        menuItem('40'),
                        menuItem('50'),
                        menuItem('60'),
                        menuItem('70'),
                        menuItem('80'),
                        menuItem('90'),
                        menuItem('100'),
                      ],
                    ),
                  ),

和小部件一样

DropdownMenuItem menuItem(String val) 
    final deviceWidth = MediaQuery.of(context).size.width;
    return DropdownMenuItem<String>(
      value: val,
      child: Container(
        width: deviceWidth * 0.6,
        child: Text(
          val,
          style: TextStyle(
            fontFamily: 'Constantia',
            fontSize: 18.0,
            color: Colors.white,
          ),
        ),
      ),
    );

代码运行良好,但 android Studio 显示这是一个问题。

【问题讨论】:

您知道如何正确输入您的DropdownMenuItem&lt;String&gt;,然后完全忘记它,甚至更改其余代码中的类型吗? 【参考方案1】:

这只是智能感知建议您在代码中提供泛型类型。

考虑将显式类型参数传递给泛型。

由于您将所有字符串值提供给menuItems。调用时最好提供泛型类型。

items : <DropdownMenuitem<String>>[
...
...
]

【讨论】:

【参考方案2】:

最好提供泛型类型以避免代码中的任何错误或错误。因为您在menuItem 函数中提到了 DropDownMenuItem,所以 android studio 会警告您在此处提供了动态。

items: <DropdownMenuItem<dynamic>>[      // ==> change dynamic to String to solve that warning
                        menuItem('none'),
                        menuItem('10'),
                        menuItem('20'),
                        menuItem('30'),
                        menuItem('40'),
                        menuItem('50'),
                        menuItem('60'),
                        menuItem('70'),
                        menuItem('80'),
                        menuItem('90'),
                        menuItem('100'),
                      ],

【讨论】:

【参考方案3】:

我猜你的代码写到一半你忘记了你的类型是什么......把它们加回去就可以了:

items: <DropdownMenuItem<String>>[
                        menuItem('none'),
                        menuItem('10'),
                        menuItem('20'),
                        menuItem('30'),
                        menuItem('40'),
                        menuItem('50'),
                        menuItem('60'),
                        menuItem('70'),
                        menuItem('80'),
                        menuItem('90'),
                        menuItem('100'),
                      ],

还有……

DropdownMenuItem<String> menuItem(String val) 
    final deviceWidth = MediaQuery.of(context).size.width;
    return DropdownMenuItem<String>(
      value: val,
      child: Container(
        width: deviceWidth * 0.6,
        child: Text(
          val,
          style: TextStyle(
            fontFamily: 'Constantia',
            fontSize: 18.0,
            color: Colors.white,
          ),
        ),
      ),
    );

【讨论】:

以上是关于无法推断类型参数“T”的主要内容,如果未能解决你的问题,请参考以下文章

无法推断通用参数“T” - Swift 5.5

高阶函数参数类型的错误类型推断

应用程序因错误而崩溃:无法推断通用参数“T”

它有时有效,但有些抛出错误:无法推断通用参数'T' - Swift

Swift 中的泛型 - “无法推断出泛型参数‘T’

从函数回调推断泛型类型参数