Flutter打开外部应用并等待其关闭后再继续操作

我在Flutter中需要打开一个外部应用(比如地图或浏览器),并在用户关闭这个外部应用后继续执行我的应用中的后续操作。目前使用url_launcher可以打开外部应用,但无法知道用户何时关闭了外部应用。有没有办法监听外部应用的关闭事件,或者在返回原应用时触发回调?希望能得到具体的实现方案或插件推荐。

3 回复

在Flutter中无法直接等待外部应用关闭后继续执行代码,因为这是由操作系统控制的。不过可以通过回调机制实现类似效果。

首先,使用url_launcher插件打开外部应用:

import 'package:url_launcher/url_launcher.dart';

Future<void> launchExternalApp() async {
  const url = "tel:123456789"; // 示例:拨打电话
  if (await canLaunch(url)) {
    await launch(url);
  } else {
    throw '无法打开链接';
  }
}

然后,在外部应用关闭时触发回调。对于拨号这种场景,可以设置一个标志位,并通过Timer轮询检查:

bool isExternalAppClosed = false;

void startAndWait() async {
  isExternalAppClosed = false;
  launchExternalApp();
  
  // 假设拨号完成后会触发某个事件(实际需自己实现)
  Timer.periodic(Duration(seconds: 1), (timer) {
    if (/* 检测拨号完成条件 */) { // 替换为实际检测逻辑
      isExternalAppClosed = true;
      timer.cancel();
    }
  });

  while (!isExternalAppClosed) {
    await Future.delayed(Duration(milliseconds: 100));
  }

  print('外部应用已关闭,继续后续操作');
}

注意:对于某些系统功能(如拨号、短信),无法获取确切关闭信号,需结合具体需求调整方案。

更多关于Flutter打开外部应用并等待其关闭后再继续操作的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,你可以使用url_launcher插件来打开外部应用。不过,默认情况下它不会等待外部应用关闭后返回。若需实现类似功能,可以通过系统特定的意图或自定义方案结合回调来实现。

  1. 使用url_launcher打开应用:
import 'package:url_launcher/url_launcher.dart';

void openApp() async {
  const url = "myapp://";
  if (await canLaunch(url)) {
    await launch(url);
  } else {
    throw 'Could not launch $url';
  }
}
  1. 对于Android,添加Intent过滤器到原生代码,并通过广播接收器监听关闭事件;对于iOS,可以使用SFSafariViewController等,配合WKWebView的代理方法。

  2. 更复杂的需求可能需要混合开发,在Flutter中调用原生模块处理复杂的交互逻辑。

总之,纯Flutter无法直接实现等待外部应用关闭后再继续执行的功能,通常需要结合原生代码实现自定义逻辑。

在 Flutter 中可以使用 url_launcher 打开外部应用,但要等待其关闭,需要结合 MethodChannel 来实现原生交互。以下是实现方案:

  1. 添加依赖:
dependencies:
  url_launcher: ^6.1.7
  1. 实现代码:
import 'package:flutter/services.dart';
import 'package:url_launcher/url_launcher.dart';

// 打开外部应用并等待返回
Future<void> openAppAndWait(String url) async {
  const platform = MethodChannel('app_control');
  
  try {
    // 原生端需要实现这个方法
    await platform.invokeMethod('waitForAppClose');
    
    // 打开外部应用
    if (await canLaunch(url)) {
      await launch(url);
    }
  } on PlatformException catch (e) {
    print("Failed: ${e.message}");
  }
}
  1. Android 原生实现 (MainActivity.kt):
class MainActivity : FlutterActivity() {
    private val CHANNEL = "app_control"

    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result ->
            if (call.method == "waitForAppClose") {
                // 这里可以添加等待逻辑
                result.success(null)
            } else {
                result.notImplemented()
            }
        }
    }
}

注意事项:

  • iOS 实现类似,需要在 AppDelegate.swift 中添加方法通道处理
  • 完全检测外部应用关闭比较困难,可能需要结合 ActivityLifecycleCallbacks (Android) 或 App States (iOS)
  • 对于特定应用,可以检测返回的 Intent 数据

这种方案并不能100%保证在所有设备上都能准确检测应用关闭,但可以实现基本的需求。

回到顶部