Flutter-如何捕获按钮(硬件)事件?

问题描述 投票:1回答:3

我创建了适用于Android的Flutter应用。这是我的用户案例:

  1. 我在widgetA上。
  2. 我单击按钮,然后转到小部件B。 (A-> B)
  3. 我单击硬件后退按钮ant返回widgetA。

    现在,我正在使用widgetA,并且我需要任何事件,以便可以更新我的WidgetA。有什么建议吗?

flutter flutter-layout
3个回答
0
投票

我想您可以将您的widgetB包装在WillPopScope小部件中。或者,您可以使用SystemChannels.keyEvent.setMessageHandler(...)设置按键处理程序,但这不是推荐的方法。



0
投票

您可以执行类似于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')),
      ),
    );
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.