【问题标题】:Google Firebase and Dagger-2 does not workingGoogle Firebase 和 Dagger-2 不工作
【发布时间】:2016-08-11 12:59:27
【问题描述】:

我想使用 Dagger2 和 Firebase。 不幸的是,我收到以下错误消息:

background_crash E/FA:工作线程上的任务异常: java.lang.IllegalStateException:名称为 [DEFAULT] 的 FirebaseApp 不存在。
W/DynamiteModule:本地模块描述符类 com.google.firebase.auth 未找到。

如果我不使用 Dagger2,一切正常。 这里有什么问题?我必须手动初始化FirebaseApp 吗?谢谢! 这是我的代码:

// App extends Application
@Override
public void onCreate() {
    super.onCreate();
    appComponent = DaggerAppComponent
            .builder()
            .appModule(new AppModule(this))
            .build();
    firebaseAnalytics = FirebaseAnalytics.getInstance(this);
}

...

// AppComponent.class
@Provides
@Singleton
public FirebaseAuth provideFirebaseAuth() {
    return FirebaseAuth.getInstance();
}

...

@ActivityScope
@Component(dependencies = AppComponent.class)
public interface SignupComponent {
    void inject(SignupActivity signupActivity);
}

...

@Inject
public FirebaseAuth firebaseAuth;

private SignupComponent signupComponent;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_signup);
    ButterKnife.bind(this);
    signupComponent = DaggerSignupComponent
            .builder()
            .appComponent(((App)getApplication()).getAppComponent())
            .build();
    signupComponent.inject(this);
}

@OnClick(R.id.sign_up_btn_sign_up)
public void clickOnSignUp() {
    String email = emailInput.getText().toString();
    String pass = passwordInput.getText().toString();

    if (!TextUtils.isEmpty(email) && !TextUtils.isEmpty(pass)) {
        progressBar.setVisibility(View.VISIBLE);
        firebaseAuth.createUserWithEmailAndPassword(email, pass)
                .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        progressBar.setVisibility(View.GONE);
                        if (task.isSuccessful()) {
                            Toast.makeText(SignupActivity.this, "yeppppa", Toast.LENGTH_SHORT).show();
                        }
                    }
                });
    }
}

Aaa 和我的构建文件

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:24.1.1'
    compile 'com.android.support:design:24.1.1'
    compile 'com.android.support:cardview-v7:24.1.1'
    compile 'com.android.support:recyclerview-v7:24.1.1'

    compile 'com.google.firebase:firebase-core:9.4.0'
    compile 'com.google.firebase:firebase-database:9.4.0'
    compile 'com.google.firebase:firebase-storage:9.4.0'
    compile 'com.google.firebase:firebase-crash:9.4.0'
    compile 'com.google.firebase:firebase-auth:9.4.0'

    compile 'com.google.dagger:dagger:2.6'
    apt 'com.google.dagger:dagger-compiler:2.6'

    compile 'com.jakewharton:butterknife:8.2.1'
    apt 'com.jakewharton:butterknife-compiler:8.2.1'
}

apply plugin: 'com.google.gms.google-services'

【问题讨论】:

  • 您是否在应用级 build.gradle 文件中添加了“compile 'com.google.firebase:firebase-auth:9.4.0'”?
  • @KetanMehta 是的,我做到了。请看我的帖子。我添加了我的构建文件。
  • 您是否在 firebase 控制台中启用了登录方法? @托比亚斯
  • 是的。正如我所写。如果我不使用 Dagger,一切正常。如果没有 Dagger,我可以保存、编辑和删除我的用户。
  • 嘿@tobias 我有同样的问题,但我解决了与 urs 将名称添加到 firebase 相同的问题,但现在我有另一个问题,应该生成 firebase 对你来说有什么运气吗?

标签: java android firebase dagger-2 firebase-crash-reporting


【解决方案1】:

这实际上与Dagger没有任何关系。它与 Firebase 崩溃报告的一个已知问题以及使用处理文件或其他资源的应用程序子类有关,这些文件或其他资源最终在主进程和崩溃报告创建的进程之间共享。很少有人讨论 Android 会为您的应用使用的每个进程创建一个新的 Application 类,在您的情况下,您实际上有两个相互冲突的 Dagger 图。

阅读本页末尾的已知问题: https://firebase.google.com/docs/crash/android

最简单的解决方案是删除 firebase-crash 依赖项,或者将您的 init 逻辑移动到 Content Provider 而不是 Application。无论如何,Android 平台团队通常不赞成使用 Application。

您也可以等到 Firebase 崩溃报告退出测试版,届时它将不再创建新进程。

【讨论】:

  • 谢谢!我删除了崩溃依赖项(但现在我收到了消息W/DynamiteModule: Local module descriptor class for com.google.firebase.auth not found.)。我重建了项目,删除了构建文件夹等。是的,我知道应用程序的使用不是很好,但我没有找到任何其他解决方案。每个“如何使用 Dagger”的示例都在使用这个应用程序类... ;)
  • 该消息只是一个警告。如果您没有看到任何行为正常,您可以忽略它。正如我在回答中提到的,Application 的替代方案是 ContentProvider。它们仅在主进程中初始化,因此在那里执行 init 是安全的,它可以在没有竞争条件或意外副作用的情况下接触文件。
【解决方案2】:
 wrong configured dagger-compiler:

compile 'com.google.dagger:dagger-compiler:2.1'

please modify project level ' build.gradle:

buildscript 
{
    dependencies {
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
    }
}
And then app level build.gradle:

First, add plugin:

apply plugin: 'com.neenbedankt.android-apt'

And then modify the dependency to

apt "com.google.dagger:dagger-compiler:2.1"

【讨论】:

  • 我已经做到了。我的 gradle 脚本工作正常。我得到同样的错误。
猜你喜欢
  • 2015-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-22
  • 2019-03-03
  • 2020-02-25
相关资源
最近更新 更多