我创建了适用于Android的Flutter应用。这是我的用户案例:
我单击硬件后退按钮ant返回widgetA。
现在,我正在使用widgetA,并且我需要任何事件,以便可以更新我的WidgetA。有什么建议吗?
我想您可以将您的widgetB包装在WillPopScope小部件中。或者,您可以使用SystemChannels.keyEvent.setMessageHandler(...)
设置按键处理程序,但这不是推荐的方法。
您可以使用RouteObserverhttps://api.flutter.dev/flutter/widgets/RouteObserver-class.html
您可以执行类似于Android startActivityForResult()
上的操作。
如果您在WidgetA
上,则推新的WidgetB
,然后等待结果。
从WidgetB
中检测窗口小部件何时弹出,并手动弹出以发送结果。
WidgetA:
class WidgetA extends StatefulWidget {
@override
State<StatefulWidget> createState() => WidgetAState();
}
class WidgetAState extends State<WidgetA> {
Future<String> _result;
Future<String> _startWidgetForResult(BuildContext context) async {
String result = await Navigator.push(
context,
MaterialPageRoute(
builder: (BuildContext context) => WidgetB(context: context),
),
);
return result;
}
@override
Widget build(BuildContext context) {
return Scaffold(
floatingActionButton: FloatingActionButton(
child: Icon(Icons.subdirectory_arrow_right),
onPressed: () => _result = _startWidgetForResult(context),
),
body: FutureBuilder(
future: _result,
builder: (context, snapshot) {
return Center(child: Text('${snapshot.data}'));
},
),
);
}
}
WidgetB:
class WidgetB extends StatelessWidget {
final BuildContext context;
WidgetB({this.context});
Future<bool> _onWillPop() async {
Navigator.of(context).pop("New data");
return false;
}
@override
Widget build(BuildContext context) {
return WillPopScope(
onWillPop: _onWillPop,
child: Scaffold(
floatingActionButton: FloatingActionButton(
child: Icon(Icons.subdirectory_arrow_left),
onPressed: () => Navigator.of(context).pop("New data"),
),
body: Center(child: Text('Press back to send new data')),
),
);
}
}