0

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();
                        }
                    }
                });
    }
}

ああ、私のビルドファイル

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'
4

2 に答える 2

2

これは実際にはダガーとは何の関係もありません。これは、メイン プロセスと Crash Reporting が作成するプロセスの間で最終的に共有されるファイルやその他のリソースを処理する Application サブクラスの使用に加えて、Firebase Crash Reporting の既知の問題に関係しています。アプリが使用するプロセスごとに Android が新しい Application クラスを作成することはあまり議論されません。あなたの場合、事実上、互いに競合する 2 つの Dagger グラフがあります。

このページの最後にある既知の問題についてお読みください: https://firebase.google.com/docs/crash/android

最も簡単な解決策は、firebase-crash の依存関係を削除するか、init ロジックをアプリケーションではなくコンテンツ プロバイダーに移動することです。とにかく、アプリケーションの使用は、Android プラットフォーム チームによって一般的に嫌われています。

また、Firebase Crash Reporting がベータ版を終了するまで待つこともできます。ベータ版が終了すると、新しいプロセスは作成されなくなります。

于 2016-08-11T19:14:16.197 に答える