:创建_MyHomePageState的全局实例。在_SubState中将此实例用作_myHomePageState.setState
:无需创建全局实例。而是将父实例传递给子窗口小部件
:
import 'package:Flutter/material.dart'; void main() => runApp(new MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return new MaterialApp( title: 'Flutter Demo', theme: new ThemeData( primarySwatch: Colors.blue, ), home: new MyHomePage(), ); } } EdgeInsets globalMargin = const EdgeInsets.symmetric(horizontal: 20.0, vertical: 20.0); TextStyle textStyle = const TextStyle( fontSize: 100.0, color: Colors.black, ); class MyHomePage extends StatefulWidget { @override _MyHomePageState createState() => _MyHomePageState(); } class _MyHomePageState extends State<MyHomePage> { int number = 0; @override Widget build(BuildContext context) { return new Scaffold( appBar: new AppBar( title: new Text('SO Help'), ), body: new Column( children: <Widget>[ new Text( number.toString(), style: textStyle, ), new GridView.count( crossAxisCount: 2, shrinkWrap: true, scrollDirection: Axis.vertical, children: <Widget>[ new InkResponse( child: new Container( margin: globalMargin, color: Colors.green, child: new Center( child: new Text( "+", style: textStyle, ), )), onTap: () { setState(() { number = number + 1; }); }, ), new Sub(this), ], ), ], ), floatingActionButton: new FloatingActionButton( onPressed: () { setState(() {}); }, child: new Icon(Icons.update), ), ); } } class Sub extends StatelessWidget { _MyHomePageState parent; Sub(this.parent); @override Widget build(BuildContext context) { return new InkResponse( child: new Container( margin: globalMargin, color: Colors.red, child: new Center( child: new Text( "-", style: textStyle, ), )), onTap: () { this.parent.setState(() { this.parent.number --; }); }, ); } }
@H_502_9@请让我知道它是否有效。
解决方法
- 例如,下面的代码中的加号按钮可以工作并且可以更新文本,但是减号按钮不能。
- 但是,如果我们按FloatingActionButton,则状态将刷新。
- 减号按钮正在更改变量的值,但未更新父窗口小部件的状态。
这是代码…
import 'package:flutter/material.dart'; void main() => runApp(new MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return new MaterialApp( title: 'Flutter Demo',theme: new ThemeData( primarySwatch: Colors.blue,),home: new MyHomePage(title: 'Flutter Demo Home Page'),); } } int number; EdgeInsets globalMargin = const EdgeInsets.symmetric(horizontal: 20.0,vertical: 20.0); TextStyle textStyle = const TextStyle( fontSize: 100.0,color: Colors.black,); class MyHomePage extends StatefulWidget { MyHomePage({Key key,this.title}) : super(key: key); final String title; @override _MyHomePageState createState() => new _MyHomePageState(); } class _MyHomePageState extends State<MyHomePage> { @override void initState() { super.initState(); number = number ?? 0; } @override Widget build(BuildContext context) { return new Scaffold( appBar: new AppBar( title: new Text(widget.title),body: new Column( children: <Widget>[ new Text( number.toString(),style: textStyle,new GridView.count( crossAxisCount: 2,shrinkWrap: true,scrollDirection: Axis.vertical,children: <Widget>[ new InkResponse( child: new Container( margin: globalMargin,color: Colors.green,child: new Center( child: new Text( "+",)),onTap: () { setState(() { number = number + 1; }); },new Sub(),],floatingActionButton: new FloatingActionButton( onPressed: () { setState(() {}); },child: new Icon(Icons.update),); } } class Sub extends StatefulWidget { @override _SubState createState() => new _SubState(); } class _SubState extends State<Sub> { @override Widget build(BuildContext context) { return new InkResponse( child: new Container( margin: globalMargin,color: Colors.red,child: new Center( child: new Text( "-",onTap: () { setState(() { number = number - 1; }); },); } }
import 'package:flutter/material.dart';
void main() => runApp(new MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'Flutter Demo',theme: new ThemeData(
primarySwatch: Colors.blue,),home: new MyHomePage(title: 'Flutter Demo Home Page'),);
}
}
int number;
EdgeInsets globalMargin = const EdgeInsets.symmetric(horizontal: 20.0,vertical: 20.0);
TextStyle textStyle = const TextStyle(
fontSize: 100.0,color: Colors.black,);
class MyHomePage extends StatefulWidget {
MyHomePage({Key key,this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => new _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
void initState() {
super.initState();
number = number ?? 0;
}
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text(widget.title),body: new Column(
children: <Widget>[
new Text(
number.toString(),style: textStyle,new GridView.count(
crossAxisCount: 2,shrinkWrap: true,scrollDirection: Axis.vertical,children: <Widget>[
new InkResponse(
child: new Container(
margin: globalMargin,color: Colors.green,child: new Center(
child: new Text(
"+",)),onTap: () {
setState(() {
number = number + 1;
});
},new Sub(),],floatingActionButton: new FloatingActionButton(
onPressed: () {
setState(() {});
},child: new Icon(Icons.update),);
}
}
class Sub extends StatefulWidget {
@override
_SubState createState() => new _SubState();
}
class _SubState extends State<Sub> {
@override
Widget build(BuildContext context) {
return new InkResponse(
child: new Container(
margin: globalMargin,color: Colors.red,child: new Center(
child: new Text(
"-",onTap: () {
setState(() {
number = number - 1;
});
},);
}
}
请让我知道它是否有效。
这是代码…
请让我知道它是否有效。