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

Flutter资源加载至Kotlin原生代码失败问题排查

问题解答

错误原因

Flutter项目assets文件夹下的文件,打包到Android APK后,不会以设备文件系统中的普通文件形式存在,而是被嵌入到APK的内部assets目录中。你直接用File类读取路径,自然会触发java.io.FileNotFoundException——因为这个路径在设备真实文件系统里根本不存在。

是否必须从Flutter项目文件夹加载?

不是必须,但如果想复用Flutter assets里的文件,在Android原生代码里得用Android的AssetManager来读取,而非直接访问文件路径。当然你也可以把文件放到Android项目的src/main/assets目录下,但这样需要维护两份文件,不如直接用Flutter打包好的assets更方便。

正确读取方式

先确保你已在Flutter项目的pubspec.yaml中正确声明该assets:

flutter:
  assets:
    - assets/labels.txt

然后在MainActivity.kt中用AssetManager读取文件内容:

import android.content.res.AssetManager
import java.io.BufferedReader
import java.io.InputStreamReader

class MainActivity : FlutterActivity() {
    private fun loadLabelsFromAssets(): String? {
        return try {
            val assetManager: AssetManager = assets
            // 路径和pubspec里声明的相对路径一致
            val inputStream = assetManager.open("labels.txt")
            val reader = BufferedReader(InputStreamReader(inputStream))
            val stringBuilder = StringBuilder()
            var line: String?
            while (reader.readLine().also { line = it } != null) {
                stringBuilder.append(line).append("\n")
            }
            reader.close()
            inputStream.close()
            stringBuilder.toString()
        } catch (e: Exception) {
            e.printStackTrace()
            null
        }
    }

    // 你的Flutter通信逻辑...
}

额外注意点

  • 路径不要加多余前缀:Flutter会把assets下的文件直接放到APK的assets根目录,所以assetManager.open()里直接写labels.txt即可,不用加assets/。
  • 若文件在assets子文件夹(比如assets/text/labels.txt),则pubspec需声明- assets/text/labels.txt,Android端读取时用text/labels.txt。

内容的提问来源于stack exchange,提问作者Thanos Rom

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 08:07:10