You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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都能正常拿到位图对象:
    // 替换原来的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);
    }
    
    配套的dp转px工具方法可直接复用:
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.25 10:06:03