Flutter 调用Android接口
1.平台通道
应用的Flutter部分通过平台通道(platform channel)将消息发送到其应用程序的所在的宿主(iOS或Android)。
宿主监听的平台通道,并接收该消息。然后它会调用特定于该平台的API(使用原生编程语言) - 并将响应发送回客户端,即应用程序的Flutter部分。

从图中我们能清楚的看到两端的交互(Flutter与App)通过MethodChannel方法来完成
事实上,Flutter定义了3种不同类型的Channel,他们分别是:
BasicMessageChannel:用于传递字符串和半结构化的信息
MethodChannel:用于传递方法调用(method invocation)
EventChannel: 用于数据流(event streams)的通信。
2.实践篇
Android部分
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
| // 创建相应的plugin插件 比如调用TuyaSmartSDk的login object ApiPlugin {
/** Channel名称 **/ private const val ChannelName = "com.ty.test/api" public const final val TAG = "AAAA"
/** * 注册API插件 * @param context 上下文对象 * @param messenger 数据信息交流对象 */ @JvmStatic fun register(context: Context, messenger: BinaryMessenger) = MethodChannel(messenger, ChannelName).setMethodCallHandler { methodCall, result -> L.e("APi methodCall.method", methodCall.method) when (methodCall.method) { "loginRequest" -> loginRequest(context, result, methodCall) //跳回native的页面 } // result.success(null) //没有返回值,所以直接返回为null }
private fun loginRequest(context: Context, result: MethodChannel.Result, methodCall: MethodCall) { L.e("login 请求", "----->") val mCountryCode = methodCall.argument<String>("mCountryCode") + "" val userName = methodCall.argument<String>("userName") + "" val password = methodCall.argument<String>("password") + "" TuyaHomeSdk.getUserInstance().loginWithPhonePassword(mCountryCode, userName, password, getLoginCallback(result))
}
fun getLoginCallback(result: MethodChannel.Result): ILoginCallback? { val callback = object : ILoginCallback { override fun onSuccess(user: User?) { result.success(JSON.toJSONString(user)) } override fun onError(code: String?, error: String?) { L.e(TAG,error) } } return callback } }
// 我们在相应的Activity里去调用 public class TYFlutterActivity extends Activity implements PluginRegistry, FlutterActivityDelegate.ViewFactory, FlutterView.Provider, LifecycleOwner {
.....
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ... //插件必须要和相应的flutterView绑定 ApiPlugin.register(this,this.getFlutterView()); GeneratedPluginRegistrant.registerWith(this);
} }
|
Flutter部分调用
1 2 3 4 5 6 7 8 9 10 11 12
| static const MethodChannel methodChannel = MethodChannel('com.ty.test/api');
Future<void> _Login() async { try { final String result = await methodChannel.invokeMethod('loginRequest',{'mCountryCode':'86','userName':'17826859067','password':'63621674ww'}); print("------------------------"+result);
} on PlatformException { // toast('') 失败的提示 } // 成功后执行相应操作 }
|
参考:https://juejin.im/post/5b84ff6a6fb9a019f47d1cc9