Flutter——Android原生View是如何通过Flutter进行加载

原生视图是如何通过Flutter进行加载渲染和交互

  • 介绍
  • 一句话概括
    • [1.在 Android 原生代码中注册 PlatformView](#1.在 Android 原生代码中注册 PlatformView)
    • [2.Flutter 中使用 PlatformViewLink 加载这个原生 View](#2.Flutter 中使用 PlatformViewLink 加载这个原生 View)

介绍

Flutter 中加载 Android 原生视图(View) ,这是完全可以实现的,Flutter 提供了官方支持:PlatformView(平台视图)机制。

一句话概括

在 Flutter 中通过 PlatformView 将 Android 原生视图(如 TextView、WebView、MapView 等)嵌入到 Flutter 的 Widget 树中。

1.在 Android 原生代码中注册 PlatformView

先创建NativeViewFactory视图类

kotlin 复制代码
class NativeTextView(context: Context, id: Int, creationParams: Map<String?, Any?>?) : PlatformView {
    private val textView: TextView = TextView(context).apply {
        text = "这是原生 Android TextView"
        textSize = 20f
        setTextColor(Color.RED)
    }

    override fun getView(): View {
        return textView
    }

    override fun dispose() {}
}

class NativeTextViewFactory(private val messenger: BinaryMessenger) : PlatformViewFactory(StandardMessageCodec.INSTANCE) {
    override fun create(context: Context, id: Int, obj: Any?): PlatformView {
        val creationParams = obj as? Map<String?, Any?>
        return NativeTextView(context, id, creationParams)
    }
}

然后在创建Plugin类,并进行注册:

kotlin 复制代码
class NativeViewPlugin : FlutterPlugin {
    override fun onAttachedToEngine(flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {
        flutterPluginBinding
            .platformViewRegistry
            .registerViewFactory("native-text-view", NativeTextViewFactory(flutterPluginBinding.binaryMessenger))
    }

    override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) {}
}

创建Widget视图,进行渲染

dart 复制代码
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

class NativeTextView extends StatelessWidget {
  const NativeTextView({super.key});

  @override
  Widget build(BuildContext context) {
    const String viewType = 'native-text-view';
    return AndroidView(
      viewType: viewType,
      layoutDirection: TextDirection.ltr,
      creationParams: {},
      creationParamsCodec: const StandardMessageCodec(),
    );
  }
}

在Flutter页面中使用

dart 复制代码
import 'package:flutter/material.dart';
import 'native_text_view.dart';

class MyPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: SizedBox(
          height: 100,
          width: 300,
          child: NativeTextView(),
        ),
      ),
    );
  }
}
相关推荐
2501_944526421 天前
Flutter for OpenHarmony 万能游戏库App实战 - 21点游戏实现
android·javascript·flutter·游戏·harmonyos
Alex老夫子1 天前
android room数据库增加字段注意事项
android·数据库
2501_915918411 天前
iOS App 测试方法,Xcode、TestFlight与克魔(KeyMob)等工具组合使用
android·macos·ios·小程序·uni-app·iphone·xcode
冬奇Lab1 天前
Android 15 显示子系统深度解析(一):显示框架总览与SurfaceFlinger核心机制
android·性能优化
代码煮茶君1 天前
MySQL 数据库死锁及核心机制全解析
android·数据库·mysql
—Qeyser1 天前
Flutter Text 文本组件完全指南
开发语言·javascript·flutter
Kratzdisteln1 天前
【1902】0120-3 Dify变量引用只能引用一层
android·java·javascript
猛扇赵四那边好嘴.1 天前
Flutter 框架跨平台鸿蒙开发 - 书籍借阅管理器应用开发教程
flutter·华为·harmonyos
2501_915921431 天前
iOS 描述文件制作过程,从 Bundle ID、证书、设备到描述文件生成后的验证
android·ios·小程序·https·uni-app·iphone·webview
冬奇Lab1 天前
【Kotlin系列10】协程原理与实战(上):结构化并发让异步编程不再是噩梦
android·开发语言·kotlin