likes
comments
collection
share

在Flutter中如何与原生代码交互?

作者站长头像
站长
· 阅读数 35

  嗨,这里是甜瓜看代码,本文将介绍 Flutter 代码如何与原生平台进行交互,包括调用原生代码和接收原生代码返回值的方法。

原生代码调用

  Flutter 与原生平台进行交互的一种方式是通过调用原生代码。Flutter 提供了一个 MethodChannel 类来实现与原生代码的通信。开发人员可以在 Flutter 应用程序中创建一个 MethodChannel,并通过它来调用原生平台的方法。以下是一个使用 MethodChannel 调用原生平台方法的例子:

// 创建一个 MethodChannel 对象,通道名称为 "app.channel.notifaction"
static const platform = MethodChannel('app.channel.notifaction');
// 调用原生平台方法
try {
 var sharedData = await platform.invokeMethod('notifactionJson');
 // 处理原生平台返回值
} on PlatformException catch (e) {
 // 处理调用原生平台方法时出现的错误
}

  在上面的代码中,创建了一个名为 app.channel.notifaction 的 MethodChannel 对象。使用 invokeMethod 方法来调用原生平台的方法 getBatteryLevel。调用完成后,将返回值存储在变量 sharedData 中。

  为了让 Flutter 应用程序能够调用原生代码,开发人员需要在原生平台中实现一个相应的方法,并将其注册到 Flutter 应用程序中。以下是一个在 Android 平台上实现 notifactionJson 方法的例子:

package com.mysteel.dream;

import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.widget.Toast;

import java.util.Set;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import io.flutter.embedding.android.FlutterActivity;
import io.flutter.embedding.engine.FlutterEngine;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugins.GeneratedPluginRegistrant;

public class MainActivity extends FlutterActivity {
    /**
     * intent跳转传递的json
     */
    private String intentStr;
    /**
     * 获取跳转json的渠道名
     */
    private static final String CHANNEL = "app.channel.notifaction";
    /**
     * 推送内容
     */
    private String payload = "";

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Intent intent = getIntent();
        String action = intent.getAction();

        if (Intent.ACTION_VIEW.equals(action)) {
            Bundle extras = intent.getExtras();
            if (extras != null) {
                payload = extras.getString("payload", "");
                Toast.makeText(this, "通知启动", Toast.LENGTH_LONG).show();
            }
        }else {
            payload = "我是来自原生的消息";
            Toast.makeText(this, "普通启动", Toast.LENGTH_LONG).show();
        }




    }

    @Override
    public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
        GeneratedPluginRegistrant.registerWith(flutterEngine);

        new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), CHANNEL)
                .setMethodCallHandler(
                        (call, result) -> {
                            if (call.method.contentEquals("notifactionJson")) {
                                result.success(payload);
                            }
                        }
                );
    }
}

  这个例子演示了如何在原生 Android 平台上实现一个名为 notifactionJson 的方法,并将其暴露给 Flutter 应用程序。这个方法用于离线推送,它的实现与设备上的 Android 版本有关。Flutter 应用程序可以使用 MethodChannel 类调用此方法并获取其返回值。

原生代码返回值

  与原生平台进行交互时,Flutter 应用程序不仅可以调用原生代码,还可以接收原生代码的返回值。MethodChannel 提供了一个 invokeMethod 方法,该方法返回一个 Future 对象,用于在原生平台方法调用完成后接收返回值。

以下是一个例子,演示如何在 Flutter 应用程序中接收原生平台方法的返回值:

final channel = MethodChannel('app.channel.notifaction');
try {
  final sharedData = await channel.invokeMethod('notifactionJson');
  print(sharedData);
} on PlatformException catch (e) {
  print(e.message);
}

  在上面的代码中,我们调用了名为 notifactionJson 的原生方法,并使用 await 等待返回值。如果调用成功,返回值将存储在变量 sharedData 中。否则,将抛出一个 PlatformException 异常。

总结

  在本文中,我们介绍了 Flutter 如何与原生平台进行交互,包括调用原生代码和接收原生代码返回值的方法。通过使用 MethodChannel 类,我们可以轻松地在 Flutter 应用程序中调用原生平台方法,并接收返回值。

  希望本文能对你提供一些帮助。这里是甜瓜看代码,期待你的关注!

转载自:https://juejin.cn/post/7224765991895515193
评论
请登录