uni.showToast 在 App 端不显示是因 WebView 浮层无法覆盖 Android 原生控件,属平台渲染层级限制;真机可用方案依次为:subNVue(轻量推荐)、Ba-Toast(需权限)、plus.android.invoke(需 Java 模块)。

uni.showToast 在 App 端为什么经常不显示?
因为 uni.showToast 是 WebView 层的 JS 渲染浮层,而 Android 上的 web-view、video、广告、地图、摄像头等组件都是系统级原生控件,Z-order 无法越级覆盖。不是样式没调好,是平台渲染层级硬限制——Toast 根本没挂到顶层 Window 上。
真机可用的三种 Toast 方案怎么选?
优先级从高到低:
-
subNVue 方案:最轻量、无需权限、DCloud 官方推荐。需在
pages.json中为页面配置"subNVue"数组,新建subNVue/toast.nvue文件,用subNVue.show('fade', 200)控制显隐。注意:不支持%单位,flex: 1要写成flex: 1 1 auto,且只能真机调试。 -
Ba-Toast 插件:社区验证最稳的穿透型插件。需在
manifest.json>app-plus>modules中启用,并在 Android 配置中添加android.permission.SYSTEM_ALERT_WINDOW权限。调用方式和uni.showToast几乎一致,但函数名仍是uni.showToast——它会自动劫持并转为原生调用。 -
plus.android.invoke 自定义 Toast:适合已有 Java 模块或需深度定制的场景。Java 端需继承
UniModule,方法加@UniJSMethod(uiThread = true)注解,用Toast.makeText(...).show();JS 端调用plus.android.invoke("com.xxx.MyModule", "showToast", "msg")。注意:uiThread = true必须设,否则 Toast 可能不出现。
plus.android.invoke 调用时常见报错
典型错误现象:java.lang.ClassNotFoundException 或 java.lang.NoSuchMethodException。
- 包名/类名/方法名大小写必须完全一致,包括
build.gradle中的package和 Java 文件顶部声明 - 方法必须是
public,且参数类型要严格匹配(如String不能传int) - Android Studio 同步后,确保生成的
.aar已正确放入nativeplugins/xxx/android/libs/ - 调试时若用模拟器,部分 Toast 权限(如 SYSTEM_ALERT_WINDOW)可能被禁用,务必用真机验证
为什么不要在 subNVue 里用 v-if 控制 Toast 显隐?
因为 v-if 会销毁/重建整个 subNVue 实例,导致原生窗口反复创建销毁,动画卡顿、内存泄漏风险高。正确做法是用 subNVue.show() / subNVue.hide() 控制 visibility,配合 opacity + transition 做淡入淡出。实际开发中,最容易被忽略的是:subNVue 的 id 必须全局唯一,且不能动态拼接——否则多次调用可能只 show 最后一个。


















