“没有引用声明‘setState’。” StatefulWidget 中 DropdownButton 的警告

Posted

技术标签:

【中文标题】“没有引用声明‘setState’。” StatefulWidget 中 DropdownButton 的警告【英文标题】:"The declaration 'setState' isn't referenced." warning for DropdownButton within StatefulWidget 【发布时间】:2021-10-23 03:53:51 【问题描述】:

我有一个有状态的小部件,我在其中放置了 DropdownButton。在 DropdownButton 的 onChange 事件中,我有一个 setState,但它一直警告我没有引用声明“setState”。 并且它实际上不会在 onChange 事件被触发时被调用。

任何建议都将受到高度赞赏。

更详细的请看下面的代码sn-p。

class TypeSetup extends StatefulWidget 
  const TypeSetup(Key? key) : super(key: key);

  @override
  _TypeSetupState createState() => _TypeSetupState();


class _TypeSetupState extends State<TypeSetup> 
  var _selectedType;
  List<Type>? _types;

  @override
  void initState() 
    super.initState();

    loadTypeJson();
  

  Future loadTypeJson() async 
    String typeJson = await DefaultAssetBundle.of(context)
        .loadString("assets/data/types.json");

    Iterable typeIter = json.decode(typeJson)["accommodation-types"];

    setState(() 
      _types = List<Type>.from(typeIter.map((model) => Type.fromJson(model)));
    );
  

  @override
  Widget build(BuildContext context) 
    final typeList = _types?.map((model) 
      return new DropdownMenuItem<String>(
        value: model.type,`enter code here`
        child: new Text(model.name),
      );
    ).toList();

    return Container(
      padding: EdgeInsets.all(DefaultPalette.defaultPadding),
      decoration: BoxDecoration(
        color: DefaultPalette.secondaryColor,
        borderRadius: const BorderRadius.all(Radius.circular(10)),
      ),
      child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [
        Text(
          "Set up",
          style: Theme.of(context).textTheme.subtitle1,
        ),
        SizedBox(
            width: double.infinity,
            child: Center(
                child: Padding(
                    padding: const EdgeInsets.all(16.0),
                    child: Container(
                      padding: EdgeInsets.only(left: 16, right: 16),
                      decoration: BoxDecoration(
                          border: Border.all(color: Colors.grey, width: 1),
                          borderRadius: BorderRadius.circular(13)),
                      child: DropdownButton(
                        hint: Text('Select  Type'),
                        dropdownColor: Colors.white,
                        icon: Icon(Icons.arrow_drop_down),
                        iconSize: 30,
                        isExpanded: true,
                        underline: SizedBox(),
                        style: TextStyle(color: Colors.black, fontSize: 22),
                        value: _selectedType,
                        onChanged: (newValue) 
                          setState() 
                            _selectedType = newValue;
                            print("Selected type changed.");
                          
                        ,
                        items: typeList,
                      ),
                    )
                )
            )
          )
      ]),
    );
  

【问题讨论】:

【参考方案1】:

你需要像这样拨打setState

setState(() 
  _selectedType = newValue;
);

【讨论】:

以上是关于“没有引用声明‘setState’。” StatefulWidget 中 DropdownButton 的警告的主要内容,如果未能解决你的问题,请参考以下文章

TypeError:'State'和'State' PYTHON 3的实例之间不支持'<'

state和setState分析

React之Props,及与state的区别

Angular ui-router 中 $state.transitionTo() 和 $state.go() 之间的区别

RN state的几种取值方法

React之正确修改state