Kotlin中如何将MainActivity的文本传递给子TextView(Flutter交互场景)
Flutter原生PlatformView文本传值失效修复
你当前实现存在3个核心逻辑错误,是传值不生效的根本原因:
- PlatformViewFactory仅在应用启动阶段
configureFlutterEngine执行时注册一次即全局生效,你在MethodChannel回调中重复创建的AndroidTextViewFactory实例没有重新注册到Flutter引擎,完全不会被调用 - AndroidTextView的init块中你新建了一个指向MainActivity的空Intent,这个实例和你之前存入文本的Intent不是同一个对象,自然读取不到putExtra的内容
- Intent仅适用于Activity、Service等Android系统组件跳转场景下的传值,PlatformView和MainActivity运行在同一个上下文,不需要绕Intent传值,直接维护共享状态即可。
修正后实现
直接在AndroidTextViewFactory中维护全局唯一的文本状态和已创建的PlatformView引用,MethodChannel收到Flutter传值时直接更新状态、刷新视图即可。
MainActivity.kt
class MainActivity : FlutterActivity() { private val androidViewId = "INTEGRATION_ANDROID" private val methodChannel = "CALL_METHOD" private val methodCallName = "CALL" override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) { super.configureFlutterEngine(flutterEngine) // 全局仅注册一次ViewFactory,持有唯一实例 val textViewFactory = AndroidTextViewFactory(flutterEngine.dartExecutor.binaryMessenger) flutterEngine.platformViewsController.registry.registerViewFactory(androidViewId, textViewFactory) MethodChannel(flutterEngine.dartExecutor.binaryMessenger, methodChannel).setMethodCallHandler { call, result -> if (call.method == methodCallName) { val receivedContent = call.arguments.toString() // 直接更新工厂持有的文本,触发视图刷新 textViewFactory.updateDisplayText(receivedContent) result.success(receivedContent) } else { result.notImplemented() } } } }
AndroidTextViewFactory.kt
class AndroidTextViewFactory(messenger: BinaryMessenger) : PlatformViewFactory(StandardMessageCodec.INSTANCE) { private val binaryMessenger: BinaryMessenger = messenger private var currentText: String = "" private var activeTextView: AndroidTextView? = null override fun create(context: Context?, viewId: Int, args: Any?): PlatformView { val creationParams = args as Map<String?, Any?>? val textView = AndroidTextView(context, viewId, creationParams, binaryMessenger, currentText) activeTextView = textView return textView } fun updateDisplayText(newText: String) { currentText = newText activeTextView?.refreshText(newText) } }
AndroidTextView.kt
internal class AndroidTextView( context: Context?, id: Int, creationParams: Map<String?, Any?>?, messenger: BinaryMessenger, initialText: String ) : PlatformView { private val textView: TextView = TextView(context) override fun getView(): View = textView override fun dispose() {} fun refreshText(newText: String) { textView.text = newText } init { textView.textSize = 36f textView.text = initialText } }
如果需要把AndroidTextView上的文本回传给Flutter,直接在AndroidTextView内部初始化对应MethodChannel,文本变化时调用
invokeMethod传值即可,不需要通过MainActivity中转。
内容的提问来源于stack exchange,提问作者Lee Vladimir
相关产品推荐
相关产品推荐

