我有一个主dart类,其中位于应用程序栏,并且应用程序栏包含刷新按钮。我正在使用导航抽屉填充其他两个视图f1和f2。
如何从main.dart中将刷新按钮单击传递给f1.dart的子片段类型,以便可以刷新f1.dart上的内容
// State of Main
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
return Scaffold(
drawer: Drawer(
child: new Column(
children: <Widget>[
////////////////////////////////////////////////////////////
new FirstFragment(),
new SecondFragment()
/////////////////////////////////////////////////////////////
],
),
),
appBar: AppBar(
title: Text(widget.title),
actions: <Widget>[
IconButton(
icon: Icon(Icons.refresh),
onPressed: () {
print("refresh pressed");
/////////////////////////
How to send this refresh pressed event to my FirstFragment class??
/////////////////////////
},
color: Colors.white,
)
],
),
body: _getDrawerItemWidget(_selectedDrawerIndex),
);
}
}
在Android中,我一直在使用事件侦听器;对于iOS,我可以为此使用委托。我该如何在颤振/飞镖上实现这一目标。 ?
答案 0 :(得分:7)
您可以传递回调,使用VoidCallback
并在您的Main小部件上接收事件。
class MainPage extends StatelessWidget {
_onTapButton() {
print("your event here");
}
@override
Widget build(BuildContext context) {
return Container(
child: ChildPage(
onTap: _onTapButton,
),
);
}
}
class ChildPage extends StatelessWidget {
final VoidCallback onTap;
const ChildPage({Key key, this.onTap}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(
child: RaisedButton(
child: Text("Click Me"),
onPressed: () {
//call to your callback here
onTap();
},
),
);
}
}
如果您需要相反的操作,则可以刷新父窗口小部件的状态并更改传递给片段的参数,也可以使用GlobalKey,如下例所示:
class MainPage extends StatelessWidget {
final GlobalKey<ChildPageState> _key = GlobalKey();
_onTapButton() {
_key.currentState.myMethod();
}
@override
Widget build(BuildContext context) {
return Container(
child: Column(
children: [
ChildPage(
key: _key,
),
RaisedButton(
child: Text("Click me"),
onPressed: _onTapButton,
)
],
)
);
}
}
class ChildPage extends StatefulWidget {
const ChildPage({Key key}) : super(key: key);
@override
ChildPageState createState() {
return new ChildPageState();
}
}
class ChildPageState extends State<ChildPage> {
myMethod(){
print("called from parent");
}
@override
Widget build(BuildContext context) {
return Container(
child: Text("Click Me"),
);
}
}