1、dart與原生交互-MethodChannel
1.1、Android
MethodChannel的兩參構(gòu)造MethodChannel(BinaryMessenger messenger, String name)要求傳一個(gè)BinaryMessenger 類型的參數(shù),網(wǎng)上很多老版本方法例如用registrar.messenger()或FlutterActivity的flutterView屬性等都已經(jīng)過(guò)時(shí),目前1.17.5應(yīng)使用:
val methodChannel = MethodChannel(flutterEngine!!.dartExecutor.binaryMessenger, "Flutter_Demo_Method")
不知道后面版本還會(huì)不會(huì)改,使用一些老教材學(xué)習(xí)時(shí)用新的SDK真的很難受······
onMethodCall的處理好像沒變:
override fun onMethodCall(methodCall: MethodCall, channelResult: MethodChannel.Result) {
when (methodCall.method) {
"updateApp" -> {
val str = methodCall.argument<String>("str")!!
val num = methodCall.argument<Int>("num")!!
val bool = methodCall.argument<Boolean>("bool")!!
val json = methodCall.argument<String>("userInfo")!!
val userInfo = Gson().fromJson<UserInfo>(json, UserInfo::class.java)
// channelResult.success("failure")
val hashMap = HashMap<String, Any?>()
hashMap["resultCode"] = 200
hashMap["resultMsg"] = "success"
channelResult.success(hashMap)
}
else -> {
channelResult.notImplemented()
}
}
}
1.2、iOS
邏輯與Android差不多,就區(qū)別在語(yǔ)法上,特別是從FlutterMethodCall讀取入?yún)?,iOS這邊沒有argument,只有arguments,所以需要將參數(shù)列表轉(zhuǎn)為NSDictionary再去解析需要的參數(shù)值
let controller : FlutterViewController = window?.rootViewController as! FlutterViewController
let methodChannel : FlutterMethodChannel = FlutterMethodChannel.init(name: "ECS_Personal_Method", binaryMessenger: controller.binaryMessenger)
methodChannel.setMethodCallHandler({(call:FlutterMethodCall, result: FlutterResult) -> Void in
let agrs = call.arguments as! NSDictionary
switch call.method {
case "updateApp" :
let str= agrs["str"] as! String
let num= agrs["num"] as! Int
let json = agrs["userInfo"] as! NSDictionary
result("")
default:
result(FlutterMethodNotImplemented)
}
})
2、webview_flutter插件
webview_flutter插件在iOS上使用時(shí)需要在Info.plist里加入
<key>io.flutter.embedded_views_preview</key>
<true/>
如果訪問http地址,還需要加
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
但是用xcode打開iOS項(xiàng)目去編輯,應(yīng)該是要這樣:

Info.plist
如果全部按照AS里的key去寫,最終沒有效果。