没有为Flutter中的类MyApp错误定义方法'setState'

时间:2018-04-01 10:39:56

标签: flutter

我在The method 'setState' isn't defined for the class MyApp error in Flutter

onSubmitted收到错误TextField

代码:

  Widget build(BuildContext context) {

    String phoneNo;

    return new MaterialApp(
      title: 'SchoolTrack',
      theme: new ThemeData(
        primaryColor: Colors.grey[50],
      ),
      home: new Scaffold(
        appBar: null,

        backgroundColor: Colors.cyan[100],

        body: new Container(

          padding: const EdgeInsets.all(32.0),
          child: new Center(
            child: new TextField(
              autofocus: true,
              autocorrect: false,


              decoration: new InputDecoration(
                  hintText: 'Type the phone no',
                  suffixIcon: new Icon(Icons.send),
                  suffixStyle: new TextStyle(
                    color: Colors.cyan[300],
                  )
              ),

                onSubmitted: (String input) {
                  setState(() {
                    phoneNo = input;
                  });
                },

            ),
          ),
        ),
      )
    );
   }

9 个答案:

答案 0 :(得分:8)

我假设您正在尝试在无状态窗口小部件中设置state,这是不可变的(无法更改)。

使用有状态小部件来执行此操作,如下所示:

class MainPage extends StatefulWidget{
  HomePage createState()=> HomePage();
}

class HomePage extends State<MainPage>{
 //Your code here
}

答案 1 :(得分:4)

您必须在有状态小部件中调用该函数

答案 2 :(得分:0)

地点

  

setState

内部

  

StatefullWidget

:)将解决问题

答案 3 :(得分:0)

使用有状态窗口小部件这样做

无论何时更改State对象的内部state,都要在传递给setState的函数中进行更改:

setState(() { _myState = newValue; });

解决上述问题,如下所示:

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {

  Widget build(BuildContext context) {

    String phoneNo;

    return new MaterialApp(
      title: 'SchoolTrack',
      theme: new ThemeData(
        primaryColor: Colors.grey[50],
      ),
      home: new Scaffold(
        appBar: null,

        backgroundColor: Colors.cyan[100],

        body: new Container(

          padding: const EdgeInsets.all(32.0),
          child: new Center(
            child: new TextField(
              autofocus: true,
              autocorrect: false,


              decoration: new InputDecoration(
                  hintText: 'Type the phone no',
                  suffixIcon: new Icon(Icons.send),
                  suffixStyle: new TextStyle(
                    color: Colors.cyan[300],
                  )
              ),

                onSubmitted: (String input) {
                  setState(() {
                    phoneNo = input;
                  });
                },

            ),
          ),
        ),
      )
    );
   }
}

答案 4 :(得分:0)

将光标置于StatelessWidget上方,然后按Alt + insert,然后单击“转换为StatefulWidget”,以快速将StatelessWidget转换为StatefulWidget

答案 5 :(得分:0)

setState仅在StatefulWidget类/子类中可用。您需要将StatelessWidget转换为StatefulWidget。简单地:

单击StatelessWidget类,然后使用 option + return (或 cmd + 如果您在macOS上使用VS Code),

enter image description here

答案 6 :(得分:0)

确保你输入正确

setState( () {} ) ;

答案 7 :(得分:0)

如果您使用的是 lambda 并且得到“未引用 setstate”,请务必使用括号正确键入:

setState(() => _counter++);

代替:

setState() => _counter++;

答案 8 :(得分:0)

如上所述,问题源于 StatelessWidget。对于使用文本编辑器进行编码的人来说,最简单的方法如下: 替换这个:

class YourClassName extends StatelessWidget { 

有了这个:

class YourClassName extends StatefulWidget {
  @override
  _YourClassNameState createState() => _YourClassNameState();
}

class _YourClassNameState extends State<YourClassName> {

所有其他事情都将相同,现在您可以在类中调用 setState :

setState(() {
      whatever you want to update goes here
    });

然而,将你的 setState 放在你自己的函数中并从任何地方轻松触发它更实用:

void funtionName(passing parameters) {
    setState(() {
      ....
    });
}

现在可以从任何地方轻松调用您的函数,例如:funtionName(parameter)。