最近项目要换架构特此学习Flutter,本教程适合像我一样刚刚开始学习Flutter的小白。
Flutter调用Android原生方法
理解
一.Android端
1.创建插件
2.确定插件中对应的渠道名称
3.命名flag,以及flag对应的Android方法。
4.将插件在FlutterActivity中完成注册
二.Flutter端
1.创建渠道
2.调用对应的flag
Android端创建渠道和方法完成注册
一.Android端代码
// 创建plugins
package io.flutter.plugins;
import android.content.Context;
import android.widget.Toast;
import io.flutter.embedding.android.FlutterActivity;
import io.flutter.plugin.common.BinaryMessenger;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
public class MytestPlugins implements MethodChannel.MethodCallHandler {
private static final String CHANNEL = "channel_name";
private Context mContext;
private MytestPlugins(Context context, BinaryMessenger binaryMessenger) {
this.mContext = context;
new MethodChannel(binaryMessenger, CHANNEL).setMethodCallHandler(this);
}
public static void registerWith(FlutterActivity activity, BinaryMessenger binaryMessenger) {
new MytestPlugins(activity, binaryMessenger);
}
@Override
public void onMethodCall(MethodCall call, MethodChannel.Result result) {
String method = call.method;
switch (method) {
case "flag_name": //与Flutter中的invokeMethod传参一一对应。
showAndroidToast();
break;
default:
result.notImplemented();
break;
}
}
private void showAndroidToast() {
Toast.makeText(mContext, "第一个Flutter invoke Native", Toast.LENGTH_LONG).show();
}
}
// 注册plugins
public class MainActivity extends FlutterActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MytestPlugins.registerWith(this, getFlutterEngine().getDartExecutor().getBinaryMessenger());
}
}
二.Flutter端
import 'package:flutter/services.dart';
ElevatedButton(
child: Text('Flutter invoke Native'),
onPressed: () {
toNative(); // 按钮点击事件调用方法;
},
),
/// 远程调用需要异步操作, 把这个方法生命成 async
static void toNative() async {
// 处理异常
try {
// channel_name这个时渠道的名称必须与Android端保持一致
// flag_name与android端的MethodCall.method字符串一一对应;
await MethodChannel('channel_name').invokeMethod('flag_name');
} on PlatformException catch (e) {
}
}