第一种可能性是将回调传递给您的孩子,第二种可能性是将
of模式用于有状态的小部件。见下文。
import 'package:flutter/material.dart';class MyStatefulWidget extends StatefulWidget { @override State<StatefulWidget> createState() => new MyStatefulWidgetState(); static MyStatefulWidgetState of(BuildContext context) { final MyStatefulWidgetState navigator = context.ancestorStateOfType(const TypeMatcher<MyStatefulWidgetState>()); assert(() { if (navigator == null) { throw new FlutterError( 'MyStatefulWidgetState operation requested with a context that does ' 'not include a MyStatefulWidget.'); } return true; }()); return navigator; }}class MyStatefulWidgetState extends State<MyStatefulWidget> { String _string = "Not set yet"; set string(String value) => setState(() => _string = value); @override Widget build(BuildContext context) { return new Column( children: <Widget>[ new Text(_string), new MyChildClass(callback: (val) => setState(() => _string = val)) ], ); }}typedef void StringCallback(String val);class MyChildClass extends StatelessWidget { final StringCallback callback; MyChildClass({this.callback}); @override Widget build(BuildContext context) { return new Column( children: <Widget>[ new FlatButton( onPressed: () { callback("String from method 1"); }, child: new Text("Method 1"), ), new FlatButton( onPressed: () { MyStatefulWidget.of(context).string = "String from method 2"; }, child: new Text("Method 2"), ) ], ); }}void main() => runApp( new MaterialApp( builder: (context, child) => new SafeArea(child: new Material(color: Colors.white, child: child)), home: new MyStatefulWidget(), ), );也可以使用InheritedWidget而不是StatefulWidget。如果您希望在父级窗口小部件的数据更改并且父级不是直接父级的情况下重建子级窗口小部件时,这特别有用。请参阅继承的小部件文档



