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
相关产品推荐
相关产品推荐

