在Android Jetpack Glance中加载Flutter资源的问题
在Glance Composable中通过Flutter AssetManager加载资源
你遇到的核心问题是Glance的上下文与应用全局上下文的差异:LocalContext.current是Glance组件专用的受限上下文,无法访问Flutter注册在应用级AssetManager中的资源。以下是修正后的实现方案:
修正代码
@Composable fun IconImage(modifier: GlanceModifier = GlanceModifier) { val assetPath = "assets/test.png" // 获取Flutter资源对应的查找键 val assetLookupKey = FlutterLoader().getLookupKeyForAsset(assetPath) // 获取应用全局上下文(而非Glance上下文) val appContext = LocalGlanceContext.current.applicationContext // 缓存bitmap避免重复加载,同时处理资源流和异常 val bitmap = remember { runCatching { appContext.assets.open(assetLookupKey).use { inputStream -> BitmapFactory.decodeStream(inputStream) } }.getOrNull() } bitmap?.let { Image( provider = ImageProvider(it), modifier = modifier, contentDescription = null ) } }
关键说明
- 使用应用全局上下文:
LocalGlanceContext.current.applicationContext能获取到绑定了Flutter AssetManager的应用上下文,这是访问Flutter资源的核心前提。 - 资源缓存与异常处理:用
remember缓存Bitmap,避免Composable重组时重复加载资源;use函数自动关闭输入流,防止资源泄漏;runCatching捕获加载过程中的异常,避免组件崩溃。 - 前置检查:确保
pubspec.yaml中已正确声明该资源,且执行过flutter pub get,保证资源被打包进APK。
内容的提问来源于stack exchange,提问作者Dario Digregorio
相关产品推荐
相关产品推荐

