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

Firebase插入数据时触发NoSuchMethodError崩溃问题求助

解决Firebase NoSuchMethodError: setTokenProvider 崩溃问题

这个问题我之前也碰到过,核心原因是你的Firebase各组件版本严重不兼容——不同Firebase库的版本差异太大,导致内部类方法不匹配,触发了NoSuchMethodError。咱们一步步来修复:

1. 用Firebase BoM统一管理所有Firebase组件版本

Firebase提供了Bill of Materials(BoM)工具,能自动确保所有Firebase库使用兼容的版本,避免手动指定版本带来的冲突。修改你的build.gradle(Module级别):

修改后的dependencies部分:

dependencies {
    implementation fileTree(dir: "libs", include: ["*.jar"])
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    implementation 'com.google.android.material:material:1.0.0'
    // 引入Firebase BoM,统一管理版本
    implementation platform('com.google.firebase:firebase-bom:28.4.2')
    // 移除单独指定版本的Firebase组件,使用BoM自动匹配版本
    implementation 'com.google.firebase:firebase-database'
    implementation 'com.google.firebase:firebase-auth'
    implementation 'com.google.firebase:firebase-storage'
    // FirebaseUI版本需要和Firebase版本兼容,这里选用适配BoM的版本
    implementation 'com.firebaseui:firebase-ui-auth:7.2.0'
    implementation 'androidx.navigation:navigation-fragment:2.3.0'
    implementation 'androidx.navigation:navigation-ui:2.3.0'
    implementation 'androidx.legacy:legacy-support-v4:1.0.0'
    implementation 'com.android.support:cardview-v7:28.0.0' // 避免使用+号,指定具体稳定版本
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}

注意:firebase-bom的版本可以选择最新稳定版,FirebaseUI的版本要和BoM对应的Firebase版本匹配,这里选7.2.0是因为它适配Firebase 28.x系列。

2. 清理构建缓存并重新编译

版本调整后,需要清理旧的构建缓存,避免残留的不兼容类:

  • 在Android Studio中点击Build > Clean Project
  • 然后点击Build > Rebuild Project

3. 修复Marks.java中的小问题(非崩溃原因,但影响功能)

你的代码里有两处小错误,虽然不会导致崩溃,但会影响数据插入:

  • 所有空值判断的Toast提示都是"Empty year",应该对应不同的字段
  • 重复调用了rslt.setMarks(...),这里应该是rslt.setGpa(...)(假设你的Result类有setGpa方法)

修正后的点击事件代码片段:

add.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        dbref = FirebaseDatabase.getInstance().getReference().child("Marks");
        try {
            if(TextUtils.isEmpty(year.getText().toString()))
                Toast.makeText(getApplicationContext(),"Empty year",Toast.LENGTH_SHORT).show();
            else if(TextUtils.isEmpty(mark.getText().toString()))
                Toast.makeText(getApplicationContext(),"Empty mark",Toast.LENGTH_SHORT).show();
            else if(TextUtils.isEmpty(subject.getText().toString()))
                Toast.makeText(getApplicationContext(),"Empty subject",Toast.LENGTH_SHORT).show();
            else if(TextUtils.isEmpty(semester.getText().toString()))
                Toast.makeText(getApplicationContext(),"Empty semester",Toast.LENGTH_SHORT).show();
            else if(TextUtils.isEmpty(gpa.getText().toString()))
                Toast.makeText(getApplicationContext(),"Empty GPA",Toast.LENGTH_SHORT).show();
            else {
                rslt.setYear(Integer.parseInt(year.getText().toString().trim()));
                rslt.setMarks(Integer.parseInt(mark.getText().toString().trim()));
                rslt.setSubjects(subject.getText().toString().trim());
                rslt.setSemester(semester.getText().toString().trim());
                rslt.setGpa(Integer.parseInt(gpa.getText().toString().trim()));
                dbref.child("mrk1").setValue(rslt);
                Toast.makeText(getApplicationContext(),"Inserted Successfully!",Toast.LENGTH_SHORT).show();
                clearcontrol();
            }
        } catch(NumberFormatException e) {
            Toast.makeText(getApplicationContext(),"Invalid input! Please enter numbers for year, mark and GPA",Toast.LENGTH_SHORT).show();
        }
    }
});

完成以上步骤后,你的应用应该就能正常连接Firebase并插入数据了。

内容的提问来源于stack exchange,提问作者Buddhika Senanayaka

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 11:02:52