Flutter 颤振:如何从单独的小部件方法调用onPressed()中的setState()
我不熟悉这个Flutter 颤振:如何从单独的小部件方法调用onPressed()中的setState(),flutter,dart,flutter-layout,Flutter,Dart,Flutter Layout,我不熟悉这个flatter 我试图在按下on时更改FlatButton文本。我的页面设计使用单独的小部件方法,因此无法在on中添加setState() 我找了很多。但是,找不到。请在这方面帮助我 import 'package:flutter/material.dart'; int number = 10; class SecondRoute extends StatelessWidget { Widget build(BuildContext context) { return
flatter
我试图在按下on
时更改FlatButton
文本。我的页面设计使用单独的小部件
方法,因此无法在on中添加setState()
我找了很多。但是,找不到。请在这方面帮助我
import 'package:flutter/material.dart';
int number = 10;
class SecondRoute extends StatelessWidget {
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text('Lists'),
backgroundColor: new Color(0xFF000000),
),
body: DynamicChange(),
);
}
}
class DynamicChange extends StatefulWidget {
@override
StateDynamic createState() => StateDynamic();
} // Class SecondRoute
class StateDynamic extends State<DynamicChange> {
Widget build(BuildContext context) {
return new Scaffold(
body: thisScreenNeeds(),
);
}
}
Widget thisScreenNeeds() {
return Container(
margin: EdgeInsets.only(top: 100, left: 50),
child: FlatButton(
child: Text(
number.toString(),
textAlign: TextAlign.center,
style: (TextStyle(
fontWeight: FontWeight.bold, fontSize: 60, color: Colors.green)),
),
onPressed: () {
// Unable to add, setState(). Throwing error.
},
));
}
尝试2
class StateDynamic extends State<DynamicChange> {
.....
.........
void _incrementCounter() {
setState(() {
number++;
});
}
.....
.......
}
onPressed: StateDynamic()._incrementCounter,
// Run Time Error:
This happens when you call setState() on a State object for a
widget that hasn't been inserted into the widget tree yet.
It is not necessary to call setState() in the constructor,
since the state is already assumed to be dirty when it is
initially created.
类状态动态扩展状态{
.....
.........
void _incrementCounter(){
设置状态(){
数字++;
});
}
.....
.......
}
onPressed:StateDynamic()。\u递增计数器,
//运行时错误:
当您对状态对象调用setState()以获取
尚未插入小部件树的小部件。
无需在构造函数中调用setState(),
因为当状态为“脏”时,它已经被假定为“脏”
最初创建的。
将方法保留在状态
类中。另外,最好将number
变量也保留在该类中。您只能在State
类中直接设置State,这就是原因
在您的情况下,解决方案
class SecondRoute extends StatelessWidget {
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text('Lists'),
backgroundColor: new Color(0xFF000000),
),
body: DynamicChange(),
);
}
}
class DynamicChange extends StatefulWidget {
@override
StateDynamic createState() => StateDynamic();
} // Class SecondRoute
class StateDynamic extends State<DynamicChange> {
int number = 10;
Widget build(BuildContext context) {
return new Scaffold(
body: thisScreenNeeds(),
);
}
Widget thisScreenNeeds() {
return Container(
margin: EdgeInsets.only(top: 100, left: 50),
child: FlatButton(
child: Text(
number.toString(),
textAlign: TextAlign.center,
style: (TextStyle(
fontWeight: FontWeight.bold,
fontSize: 60,
color: Colors.green)),
),
onPressed: () {
setState(() {
number++;
});
},
));
}
}
将方法保留在状态
类中。另外,最好将number
变量也保留在该类中。您只能在State
类中直接设置State,这就是原因
在您的情况下,解决方案
class SecondRoute extends StatelessWidget {
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text('Lists'),
backgroundColor: new Color(0xFF000000),
),
body: DynamicChange(),
);
}
}
class DynamicChange extends StatefulWidget {
@override
StateDynamic createState() => StateDynamic();
} // Class SecondRoute
class StateDynamic extends State<DynamicChange> {
int number = 10;
Widget build(BuildContext context) {
return new Scaffold(
body: thisScreenNeeds(),
);
}
Widget thisScreenNeeds() {
return Container(
margin: EdgeInsets.only(top: 100, left: 50),
child: FlatButton(
child: Text(
number.toString(),
textAlign: TextAlign.center,
style: (TextStyle(
fontWeight: FontWeight.bold,
fontSize: 60,
color: Colors.green)),
),
onPressed: () {
setState(() {
number++;
});
},
));
}
}
Widget thisScreenNeeds(){return Container();},我已经为按钮使用了单独的小部件。行吗?试试看。回调在开始时可能会混淆,但它非常简单。Widget ThisScreenRequireds(){return Container();},这是错误的吗?@McDonal_11是的,很抱歉我没有完全阅读您的问题,答案主要基于主题,解决方法其实很简单。现在我来分享一下。那么,不是Widget thisScreenNeeds(),而是类ButtonWidget扩展了无状态Widget{},这种方式合适吗?请在这个.Widget thisScreenNeeds(){return Container();}中澄清我的问题,我已经为按钮使用了单独的小部件。行吗?试试看。回调在开始时可能会混淆,但它非常简单。Widget ThisScreenRequireds(){return Container();},这是错误的吗?@McDonal_11是的,很抱歉我没有完全阅读您的问题,答案主要基于主题,解决方法其实很简单。现在我来分享一下。那么,不是Widget thisScreenNeeds(),而是类ButtonWidget扩展了无状态Widget{},这种方式合适吗?请澄清这一点。
class App extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Home(),
);
}
}
class Home extends StatefulWidget {
@override
_HomeState createState() => _HomeState();
}
class _HomeState extends State<Home> {
String text = 'Some text';
@override
Widget build(BuildContext context) {
return Scaffold(
body: Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
Text(text),
ButtonWidget(stateSetter),
],
),
);
}
void stateSetter() {
setState(() {
text = 'Changed text';
});
}
}
class ButtonWidget extends StatelessWidget {
final VoidCallback stateSetter;
ButtonWidget(this.stateSetter);
@override
Widget build(BuildContext context) {
return RaisedButton(
onPressed: this.stateSetter,
);
}
}