Contents
  1. 1. Flutter 调用Android接口
    1. 1.1. 1.平台通道
    2. 1.2. 2.实践篇
      1. 1.2.1. Android部分
      2. 1.2.2. Flutter部分调用

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