Flutter嵌入安卓原生View调用startActivity报Failed to resolve attribute at index 6错误
问题根因
你触发的报错核心原因是点击后启动的AppCompat Activity没有正确加载带AppCompat属性的主题,你给CustomNativeView套的ContextThemeWrapper仅作用于当前平台视图本身,完全不会影响新启动Activity的主题配置,所以你之前给View加主题的操作对Activity无效。
解决步骤
- 在AndroidManifest中为目标Activity显式指定AppCompat主题
直接给你要启动的Activity标签配置你自定义的MainTheme,避免其继承Application级别的缺省主题导致属性缺失:
<activity android:name="你要启动的Activity全类名" android:theme="@style/MainTheme" />
- 修正自定义主题的冗余配置
AppCompat系列主题的属性不需要重复添加带android:前缀的配置,重复定义反而可能导致属性冲突,修改你的样式如下:
<style name="MainTheme" parent="Theme.AppCompat.Light.NoActionBar"> <item name="android:textAppearance">@style/CustomTextAppearance</item> <!-- 仅保留不带android前缀的AppCompat属性即可 --> <item name="colorPrimary">#d3b170</item> <item name="colorPrimaryDark">#d3b170</item> <item name="colorAccent">#d3b170</item> <item name="android:textColorPrimary">#d3b170</item> <item name="android:textColorLink">#d3b170</item> </style> <style name="CustomTextAppearance" parent="TextAppearance.AppCompat.Headline"> <item name="android:textColor">#d3b170</item> <!-- 可额外把textColorLink加到TextAppearance里兜底 --> <item name="android:textColorLink">#d3b170</item> </style>
- 修正启动Activity的Context来源
不要用CustomNativeView持有的View上下文启动Activity,优先获取当前Flutter宿主Activity的实例来启动:
在Flutter插件的原生侧代码中,先通过FlutterPluginBinding获取Activity实例,再调用startActivity,示例逻辑如下:
// 插件初始化时缓存Activity引用 private var activity: Activity? = null override fun onAttachedToActivity(binding: ActivityPluginBinding) { activity = binding.activity } // 点击NativeView要启动Activity时调用 view.setOnClickListener { activity?.startActivity(Intent(activity, TargetActivity::class.java)) // 如果你非要用Application上下文启动,必须加NEW_TASK flag,且确保Application也配置了MainTheme // context.applicationContext.startActivity(Intent(context, TargetActivity::class.java).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)) }
验证方案
如果修改后仍报错,可先把Activity的主题临时换成系统自带的@style/Theme.AppCompat.Light.NoActionBar,确认原生Activity本身能正常启动后,再逐步自定义主题属性,排查是否是自定义样式的属性冲突。
内容的提问来源于stack exchange,提问作者RMK
相关产品推荐
相关产品推荐

