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

如何在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代码,避免资源重复维护。

  1. 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());
}
  1. 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目录,这样你原来的代码就能直接访问。

  1. 确认Flutter pubspec.yaml已正确声明assets
flutter:
  assets:
    - assets/images/
  1. 修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 12:52:41