如何在Kotlin自定义视图中访问Flutter根目录下的图片?
解决Flutter Android模块Kotlin类访问Flutter根目录图片的问题
问题根源
你直接使用Android原生的context.assets.open()访问的是Android模块自身的src/main/assets目录,但Flutter根目录的assets由Flutter框架独立管理,不会自动同步到Android原生的assets文件夹,因此会出现文件找不到的错误。
解决方案
方法一:通过Method Channel从Flutter端获取图片字节流(推荐,符合Flutter资源管理逻辑)
这种方式让Flutter负责读取自身管理的assets,再通过Method Channel将图片字节数据传递给原生Kotlin代码,避免资源重复维护。
- Flutter端(Dart代码)
import 'package:flutter/services.dart'; import 'dart:typed_data'; class ImageChannel { static const MethodChannel _channel = MethodChannel('image_channel'); static Future<Uint8List?> getImageBytes(String imageName) async { try { final ByteData data = await rootBundle.load('assets/images/$imageName'); return data.buffer.asUint8List(); } catch (e) { print('Flutter加载图片失败: $e'); return null; } } static void setupChannel() { _channel.setMethodCallHandler((call) async { if (call.method == 'getImage') { String imageName = call.arguments as String; return await getImageBytes(imageName); } return null; }); } } // 在main函数中初始化Channel void main() { ImageChannel.setupChannel(); runApp(const MyApp()); }
- Kotlin端(CustomHomeView类)
val imagePath = widgetData.getString("image", null) if (imagePath != null) { val channel = MethodChannel(context, "image_channel") channel.invokeMethod("getImage", imagePath, object : MethodChannel.Result { override fun success(result: Any?) { val bytes = result as ByteArray? bytes?.let { val bitmap = BitmapFactory.decodeByteArray(it, 0, it.size) setImageViewBitmap(R.id.backgroundImage, bitmap) } } override fun error(errorCode: String, errorMessage: String?, errorDetails: Any?) { Log.e("CustomHomeView", "从Flutter获取图片失败: $errorMessage") } override fun notImplemented() {} }) }
方法二:将Flutter assets同步到Android原生assets目录(适合简单场景,维护成本较高)
通过Android构建脚本,把Flutter根目录的assets复制到Android模块的assets目录,这样你原来的代码就能直接访问。
- 确认Flutter pubspec.yaml已正确声明assets
flutter: assets: - assets/images/
- 修改Android模块的app级build.gradle
在android节点下添加sourceSets配置,同步Flutter图片资源:
android { // 其他原有配置... sourceSets { main { assets.srcDirs += file("../../assets/images/") // 路径说明:从android/app目录向上两级回到Flutter根目录,再指向assets/images } } }
配置完成后重新构建Android项目,即可使用你原来的代码加载图片。
注意事项
- 方法二需要在Flutter assets更新后重新构建Android项目,否则新添加的图片不会同步。
- 方法一更符合Flutter跨平台设计理念,避免资源重复存储与维护。
内容的提问来源于stack exchange,提问作者Bear
相关产品推荐
相关产品推荐

