You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 18:36:25