使用LoadingButtonAndroid库配合Firebase注册时出现非空参数异常
问题根因定位
抛出的IllegalArgumentException已经明确指明:你使用的LoadingButton库的doneLoadingAnimation方法接收的bitmap参数为null。
这个库是Kotlin开发的,对所有标注为非空的参数,会在方法入口直接做空校验,一旦传null就会抛出你遇到的栈帧异常,本质不是库的bug,是传入的参数不符合方法要求。
结合你贴的代码,这个null值来自于BitmapFactory.decodeResource(getResources(), R.drawable.ic_baseline_check_24)的返回值,触发场景通常有三种:
- 引用的
ic_baseline_check_24资源实际是矢量图(VectorDrawable),直接用BitmapFactory解析矢量图本身就会返回null,这是最常见的踩坑点 - 资源文件路径错误,R类中记录的drawable ID没有对应实际文件,decode自然拿不到位图内容
- 图片资源密度和当前设备不匹配,系统找不到对应密度的位图时decode也会返回null
具体修复方案
- 替换bitmap生成逻辑,解决decode返回null的问题
不要直接用BitmapFactory解析矢量资源,改用Drawable转Bitmap的通用兼容写法,全版本Android都能正常拿到位图对象:
配套的dp转px工具方法可直接复用:// 替换原来的BitmapFactory.decodeResource那行代码 Drawable checkDrawable = ContextCompat.getDrawable(LoginActivity.this, R.drawable.ic_baseline_check_24); Bitmap bitmap = null; if (checkDrawable != null) { int width = checkDrawable.getIntrinsicWidth(); int height = checkDrawable.getIntrinsicHeight(); // 避免宽高为0导致创建Bitmap失败 if (width <= 0) width = dp2px(24); if (height <= 0) height = dp2px(24); bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); checkDrawable.setBounds(0, 0, width, height); checkDrawable.draw(canvas); }private int dp2px(int dp) { return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, getResources().getDisplayMetrics()); } - 给动画调用加非空容错,避免硬传null
在成功回调里调用doneLoadingAnimation之前加判断,哪怕资源加载出问题也不会触发Kotlin的NonNull参数校验异常:@Override public void onComplete(@NonNull Task<AuthResult> task) { if (task.isSuccessful()) { if (bitmap != null) { int color = ContextCompat.getColor(LoginActivity.this, R.color.colorPrimaryDark); btn.doneLoadingAnimation(color, bitmap); } else { // 拿不到bitmap的时候直接切回按钮初始状态,不影响业务流程 btn.revertAnimation(); } Intent in = new Intent(LoginActivity.this, mainDrawerActivity.class); startActivity(in); finish(); } else { btn.revertAnimation(); Toast.makeText(LoginActivity.this, task.getException().getLocalizedMessage(), Toast.LENGTH_SHORT).show(); } } - 修正重复方法调用导致的状态异常
你原来在失败分支同时调用了btn.revertAnimation()和btn.stopAnimation(),两个接口连续触发很容易导致按钮状态锁死(后续无法点击),删掉多余的stopAnimation()调用即可——revertAnimation()本身就会结束按钮的加载状态,切回初始可交互样式。
内容的提问来源于stack exchange,提问作者vikram
相关产品推荐
相关产品推荐

