在 Flutter add2app 场景中,如何让应用返回按钮返回宿主应用?

nAn*_*oid 5 android flutter

我在 add2app 场景中使用 flutter,其中主机应用程序启动 flutterView 并且 flutter 视图是一个 flutter 模块,如https://github.com/flutter/flutter/wiki/Add-Flutter-to-existing-apps

我有一个带有片段的活动。该片段有

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

    FlutterView flutterView = Flutter.createView(getActivity(), getLifecycle(), route);
    GeneratedPluginRegistrant.registerWith(flutterView.getPluginRegistry());

return flutterView;
Run Code Online (Sandbox Code Playgroud)

我想知道最好的洗涤方法是什么,以便应用栏中的 dart 代码可以在左上角有一个后退按钮,以实现主机片段及其活动中 super.onBackPressed 的效果 - 即左上角后退按钮的行为方式与硬件后退按钮相同,将您返回到主机应用程序后退堆栈中的上一个屏幕。

我试过了

appBar: AppBar(
    leading: BackButton()
    title: const Text("My Screen Title),
    ),
Run Code Online (Sandbox Code Playgroud)

但正如预期的那样,因为它是initialRoute,那么canPop=false。我还尝试了一个自定义的 BackButton(),它是相同的,除了

return IconButton(
  icon: const BackButtonIcon(),
  color: color,
  tooltip: MaterialLocalizations.of(context).backButtonTooltip,
  onPressed: () {
    Navigator.maybePop(context);
  }
);
Run Code Online (Sandbox Code Playgroud)

像 back_button.dart 它使用

Navigator.Pop(context);
Run Code Online (Sandbox Code Playgroud)

代替

Navigator.maybePop(context);
Run Code Online (Sandbox Code Playgroud)

毫不奇怪,它会导致一个空白的黑屏,而不是返回到 Android 平台 java 代码。

我希望我可以并且可能会使用平台调用来执行 fragment.getActivity().finish() 但我想知道是否还有更好的方法,因为这似乎相当基本。

提前致谢

Dig*_*oun 6

我知道这篇文章很旧,但我只是在寻找同样的东西,并发现这可以通过调用 Dart 代码来完成:

SystemNavigator.pop();
Run Code Online (Sandbox Code Playgroud)

Flutter iOS 添加到应用程序文档中提到了它,但它也适用于 Android。


Flu*_*ery 1

查看此问题的另一种方法是:如何从我的 Flutter 应用程序发送消息来指示 Android 采取某些操作。

在这种情况下,您想要的是点击 Flutter 中的后退按钮以使 Android 转到finish()当前 Activity,或者指示包含的 Fragment 执行某些自定义导航操作。

Dart 和 Android 之间的消息传递是通过使用平台通道来完成的。以下指南介绍了如何设置和使用平台通道:

https://flutter.io/docs/development/platform-integration/platform-channels

所以我会从 Flutter 中的一些内容开始,如下所示:

MaterialApp(
  appBar: AppBar(
    leading: IconButton(
      icon: Icons.back,
      onPressed: () {
        // Send your platform channel message, or invoke some other method that will.
      }
    ),
    title: const Text("My Screen Title),
  ),
);
Run Code Online (Sandbox Code Playgroud)