我在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;
});
},
),
),
),
)
);
}
答案 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),
答案 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)。