Flutter APP跳转Flutter APP 携带参数

我这边使用的是通过原生交互 进行跳转,

大概流程:发送端Flutter ->发送端原生->接收端原生->接收端Flutter

1.发送端Flutter

Dart 复制代码
 //建立发送端Flutter和发送端原生通道
  static const platform = MethodChannel('com.example.jhej_app/send_app_channel');
  Future<void> _launchAppWithParams() async {
    try {
      final Map<String, dynamic> result = await platform.invokeMethod(
        'jumpToJHEJApp',//通道方法名称
        {
          'targetPackage': 'com.example.jh_app', // 跳转的应用包名
          'targetActivity': 'com.example.jh_app.MainActivity',// 跳转的应用在跳转到对应的Activity名称
          'data': {//携带的参数
            'name': "66666",
            'timestamp': DateTime.now().millisecondsSinceEpoch.toString(),
            'source': '江湖二级'
          }
        },
      );
      print('跳转结果: $result');
    } on PlatformException catch (e) {
       showToast('${e.message}');
    }
  }

2.发送端原生 接收到发送端Flutter的数据

Dart 复制代码
class MainActivity : FlutterFragmentActivity() {
    private val SENDCHANNEL = "com.example.jhej_app/send_app_channel"//江湖二级发送到江湖APP的数值
    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        MethodChannel(flutterEngine.dartExecutor.binaryMessenger, SENDCHANNEL).setMethodCallHandler { call, result ->
            if(call.method == "jumpToJHEJApp"){//刚才设置的通道方法
                val targetPackage = call.argument<String>("targetPackage")//跳转的包名
                val targetActivity = call.argument<String>("targetActivity")//跳转的包名应用对应的页面
                val data = call.argument<Map<String, Any>>("data")//跳转携带的数据

                 try {
                    //判断是否安装了对应的APP
                    if(AppInstallChecker().isAppInstalled(this.applicationContext, targetPackage!!)){
                        val intent = Intent().apply {//设置跳转参数
                            setClassName(targetPackage!!, targetActivity!!)
                            data?.forEach { (key, value) ->
                                when (value) {
                                    is String -> putExtra(key, value)
                                    is Int -> putExtra(key, value)
                                    is Long -> putExtra(key, value)
                                    is Boolean -> putExtra(key, value)
                                }
                            }
                            // 添加标志确保在新任务中启动
                            addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
                        }

                        startActivity(intent)//进行跳转
                        result.success("跳转成功")
                    }else{
                        result.error("APP_NOT_INSTALLED", "请先安装APP", null)
                    }
                } catch (e: Exception) {
                    result.error("JUMP_ERROR", "跳转失败: ${e.message}", null)
                }
            }else{
                result.notImplemented()
            }
        }
    }
}

2.2判断app是否安装

Dart 复制代码
class AppInstallChecker {
    /**
     * 通过包名检测应用是否安装
     * @param context 上下文
     * @param packageName 目标应用包名
     * @return true表示已安装,false表示未安装
     */
    fun isAppInstalled(context: Context, packageName: String): Boolean {
        return try {
            val info = context.packageManager.getApplicationInfo(packageName, PackageManager.GET_UNINSTALLED_PACKAGES)
            true
        } catch (e: PackageManager.NameNotFoundException) {
            false
        }
    }

    /**
     * 通过Intent检测应用是否安装(支持隐式意图)
     * @param context 上下文
     * @param intent 目标Intent
     * @return true表示可处理该Intent的应用存在,false表示不存在
     */
    fun isIntentAvailable(context: Context, intent: android.content.Intent): Boolean {
        return context.packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY).size > 0
    }
}

3.接收端原生

Dart 复制代码
class MainActivity : FlutterActivity(){
    private val ACCEPTCHANNEL = "com.example.jh_app/accept_app_channel"//创建和接收端Flutter通道
    private lateinit var methodChannel: MethodChannel
    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)

        methodChannel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, ACCEPTCHANNEL)
        methodChannel.setMethodCallHandler { call, result ->
            when (call.method) {//自定义设置每次跳转都监听方法
                "setupIntentListener" -> {
                    // 设置监听成功
                    result.success("监听设置成功")
                }
                else -> result.notImplemented()
            }
        }
        // 立即处理当前Intent数据
        processCurrentIntent()
    }
    override fun onNewIntent(intent: Intent) {
        super.onNewIntent(intent)
        setIntent(intent)
        processCurrentIntent()
    }
    private fun processCurrentIntent() {
        try {
            val currentIntent = intent
            val extras = currentIntent?.extras

            if (extras != null && !extras.isEmpty) {
                // 构建要传递给Flutter的数据
                val dataJson = JSONObject()
                dataJson.put("name", extras.getString("name", ""))
                dataJson.put("timestamp", extras.getString("timestamp", ""))
                dataJson.put("source", extras.getString("source", ""))

                // 将数据作为参数传递给Flutter
                methodChannel.invokeMethod("getNewReceivedData", dataJson.toString())//传递数据到接收端Flutter
            }

        } catch (e: Exception) {
            e.printStackTrace()
            methodChannel.invokeMethod("getNewReceivedData", e.toString())
        }
    }
}

4.接收端Flutter

Dart 复制代码
  @override
  void initState() {
    super.initState();
    _setupIntentListener();

  }

  static const platform = MethodChannel('com.example.jh_app/accept_app_channel');//这里和接收原生端保持一致
  Map<dynamic, dynamic> _receivedData = {};
  Future<void> _setupIntentListener() async {
    try {
      // 设置原生端监听
      await platform.invokeMethod('setupIntentListener');
      // 监听来自原生端的数据更新通知
      platform.setMethodCallHandler((call) async {
        if (call.method == "getNewReceivedData") {//和接收原生端保持一致
          showToast("66666");
          setState(() {
            _receivedData = jsonDecode(call.arguments.toString());
          });
          if (_receivedData.isNotEmpty) {
            _showReceivedDataDialog();
          }
        }
        return null;
      });
    } on PlatformException catch (e) {
      print("设置监听失败: ${e.message}");
    }
  }
  void _showReceivedDataDialog() {
    _receivedData.clear();
    if(_receivedData["name"]==null){
      showToast("数据为空");
      return;
    }
    showToast(_receivedData["name"]);
  }
相关推荐
程序员老刘·29 分钟前
跨平台开发地图:2025跨平台技术简单总结 | 2026年1月
flutter·跨平台开发·客户端开发
jacGJ8 小时前
记录学习--文件读写
java·前端·学习
毕设源码-赖学姐8 小时前
【开题答辩全过程】以 基于WEB的实验室开放式管理系统的设计与实现为例,包含答辩的问题和答案
前端
幻云20108 小时前
Python深度学习:从筑基到登仙
前端·javascript·vue.js·人工智能·python
我即将远走丶或许也能高飞10 小时前
vuex 和 pinia 的学习使用
开发语言·前端·javascript
钟离墨笺10 小时前
Go语言--2go基础-->基本数据类型
开发语言·前端·后端·golang
爱吃泡芙的小白白11 小时前
Vue 3 核心原理与实战:从响应式到企业级应用
前端·javascript·vue.js
夜雨声烦丿11 小时前
Flutter 框架跨平台鸿蒙开发 - 思维导图开发教程
flutter·华为·harmonyos
卓怡学长11 小时前
m115乐购游戏商城系统
java·前端·数据库·spring boot·spring·游戏
2501_9445264211 小时前
Flutter for OpenHarmony 万能游戏库App实战 - 蜘蛛纸牌游戏实现
android·java·python·flutter·游戏