之前寫(xiě)過(guò)通過(guò)MethodChannel來(lái)調(diào)取原生方法摹菠。http://www.reibang.com/p/6b677ff3350e
但是這次是直接在Flutter里面調(diào)用一個(gè)android view病瞳。
一、Flutter項(xiàng)目中嵌入單個(gè)的Android View,步驟如下:
-
首先找到flutter項(xiàng)目下的android目錄,點(diǎn)擊包名下面的MainActivity,在編輯器的右上角有一個(gè)Open forEditing in Android studio 按鈕辣之,點(diǎn)擊它可以進(jìn)入純android的項(xiàng)目中。
android studio - 在包名下創(chuàng)建一個(gè)原生view皱炉,代碼如下
package com.example.flutter_demo
import android.content.Context
import android.view.View
import android.widget.TextView
import io.flutter.plugin.common.BinaryMessenger
import io.flutter.plugin.platform.PlatformView
class MyFlutterView(context: Context,messager : BinaryMessenger,
viewId: Int,argus: Map<String,Any>) : PlatformView{
var text : TextView = TextView(context)
init {
text.text = "原生的textvieww"
}
override fun getView(): View {
return text
}
override fun dispose() {
}
}
- 在創(chuàng)建一個(gè)PlatformViewFactory怀估,把原生view提供出去。代碼如下
package com.example.flutter_demo
import android.content.Context
import io.flutter.plugin.common.BinaryMessenger
import io.flutter.plugin.common.StandardMessageCodec
import io.flutter.plugin.platform.PlatformView
import io.flutter.plugin.platform.PlatformViewFactory
class MyFlutterViewFactory(private val messager : BinaryMessenger) : PlatformViewFactory(StandardMessageCodec.INSTANCE) {
override fun create(context: Context?, viewId: Int, args: Any?): PlatformView {
return MyFlutterView(context!!, messager,viewId,args as Map<String,Any>)
}
}
- 在創(chuàng)建一個(gè)FlutterPlugin,用來(lái)注冊(cè)PlatformViewFactory娃承,代碼如下
package com.example.flutter_demo
import io.flutter.embedding.engine.plugins.FlutterPlugin
class MyPlugin : FlutterPlugin{
override fun onAttachedToEngine(binding: FlutterPlugin.FlutterPluginBinding) {
var binaryMessenger = binding.binaryMessenger
binding.platformViewRegistry.registerViewFactory( "plugins.flutter.io/custom_platform_view",
MyFlutterViewFactory(binaryMessenger))
}
companion object{
@JvmStatic
fun registerWith(registry: io.flutter.plugin.common.PluginRegistry.Registrar){
registry.platformViewRegistry().registerViewFactory("plugins.flutter.io/custom_platform_view",
MyFlutterViewFactory(registry.messenger()))
}
}
override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) {
}
}
- 最后在MainActivity里面添加插件奏夫,代碼如下
package com.example.flutter_demo
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
class MainActivity: FlutterActivity() {
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
flutterEngine.plugins.add(MyPlugin())
}
}
到此為止怕篷,android端的代碼完成历筝。再看下flutter端怎么調(diào)用android view
- 判斷一下平臺(tái)酗昼,然后跟flutter一樣調(diào)用android view,代碼如下
getwidget7(){
if(defaultTargetPlatform == TargetPlatform.android){
return AndroidView(viewType: "plugins.flutter.io/custom_platform_view",creationParams: {"ss":333},
creationParamsCodec: StandardMessageCodec(),);
}
}
其中viewType和原生里面保持一致梳猪,creationParams是給原生傳遞參數(shù)的麻削。
直接運(yùn)行就可以實(shí)現(xiàn)在flutter里面使用android view。tip:注意使用真機(jī)春弥,我在使用模擬器的時(shí)候跑不起來(lái)呛哟。
調(diào)用原生view可以和調(diào)用原生方法一起用。