要调用父函数,可以使用回调模式.在本例中,函数(onColorSelected
)被传递给子函数.按下按钮时,子元素会调用该函数:
import 'package:flutter/material.dart';
class Parent extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return ParentState();
}
}
class ParentState extends State<Parent> {
Color selectedColor = Colors.grey;
@override
Widget build(BuildContext context) {
return Column(
children: <Widget>[
Container(
color: selectedColor,
height: 200.0,
),
ColorPicker(
onColorSelect: (Color color) {
setState(() {
selectedColor = color;
});
},
)
],
);
}
}
class ColorPicker extends StatelessWidget {
const ColorPicker({this.onColorSelect});
final ColorCallback onColorSelect;
@override
Widget build(BuildContext context) {
return Row(
children: <Widget>[
RaisedButton(
child: Text('red'),
color: Colors.red,
onPressed: () {
onColorSelect(Colors.red);
},
),
RaisedButton(
child: Text('green'),
color: Colors.green,
onPressed: () {
onColorSelect(Colors.green);
},
),
RaisedButton(
child: Text('blue'),
color: Colors.blue,
onPressed: () {
onColorSelect(Colors.blue);
},
)
],
);
}
}
typedef ColorCallback = void Function(Color color);
内部Flutter 小部件(如按钮或表单域)使用完全相同的模式.如果您只想调用不带任何参数的函数,则可以使用VoidCallback
类型,而不是定义您自己的回调类型.
如果要通知更高级别的父级,只需在每个层次 struct 级别上重复此模式即可:
class ColorPickerWrapper extends StatelessWidget {
const ColorPickerWrapper({this.onColorSelect});
final ColorCallback onColorSelect;
@override
Widget build(BuildContext context) {
return Padding(
padding: EdgeInsets.all(20.0),
child: ColorPicker(onColorSelect: onColorSelect),
)
}
}
在Flatter中,不鼓励从父窗口小部件调用子窗口小部件的方法.相反,Flatter鼓励您将子对象的状态作为构造函数参数传递.您只需在父窗口小部件中调用setState
来更新其子对象,而不是调用子对象的方法.
另一种方法是Flutter 中的controller
个课程(ScrollController
,AnimationController
,.).这些也作为构造函数参数传递给子对象,并且它们包含无需对父对象调用setState
就可以控制子对象状态的方法.示例:
scrollController.animateTo(200.0, duration: Duration(seconds: 1), curve: Curves.easeInOut);
然后要求子元素们收听这些更改以更新其内部状态.当然,您也可以实现自己的控制器类.如果需要,我建议您查看Ffltter的源代码以了解它是如何工作的.
期货和流是向下传递状态的另一种 Select ,也可以用来调用子对象的函数.
但是我真的不推荐这样做.如果您需要调用子窗口小部件的方法,很可能是您的应用程序架构有缺陷.Try to move the state up to the common ancestor!个