Android SnackBar显示时Action立即触发而非点击触发的问题
问题产生原因
- 参数类型定义错误:封装方法中操作参数被定义为
Unit类型,该类型代表代码执行后的无返回值结果,并非可延迟触发的函数类型。调用方法时传入undoAction(),代码执行到传参阶段就会立刻运行undoAction()方法,将执行得到的Unit结果传入方法,逻辑触发时机完全早于用户点击操作。 - 点击回调逻辑无效:
setAction绑定的lambda表达式中仅书写了action变量,既没有正确触发传入的业务逻辑,且由于参数本身是提前执行完的结果,用户点击按钮时不会产生任何响应。 - 类名拼写错误:封装方法中
SnackBar.make的类名拼写不符合规范,Material组件库中Snackbar的正确类名为Snackbar(b为小写),拼写错误会直接导致编译失败。
修复方法
- 修改封装方法的参数类型,将第三个参数从
Unit改为无参无返回值的函数类型() -> Unit,代表传入的是可延迟执行的逻辑块,传参阶段不会立刻触发执行。 - 在
setAction的点击回调中,通过action()主动调用传入的函数,确保用户点击按钮时才执行对应逻辑。 - 修正类名拼写错误,同时调整调用处的传参方式:不要写带括号的
undoAction()(带括号代表立刻执行方法),改用函数引用::undoAction或者lambda表达式传参。
修复后的完整代码如下:
修正后的Snackbar封装方法
// 第三个参数改为函数类型 () -> Unit,修正Snackbar类名拼写 fun showSnackBar(msg:String, btnMsg:String, action: () -> Unit){ Snackbar.make(binding.root, msg, Snackbar.LENGTH_SHORT) .setAction(btnMsg){ // 点击回调触发时才执行传入的操作 action() } .show() }
修正后的方法调用代码
// 用函数引用::undoAction传参,传参阶段不会立刻执行方法 showSnackBar("Added","Undo", ::undoAction) // 如果需要在操作里添加额外逻辑,也可以用lambda写法 // showSnackBar("Added","Undo") { // // 可添加其他前置/后置逻辑 // undoAction() // } fun undoAction(){ // 列表项删除逻辑 }
内容的提问来源于stack exchange,提问作者dimioLt
相关产品推荐
相关产品推荐

