2

Toothpick DI をフラグメントで使用しようとすると、奇妙なエラーが発生します。

toothpick.registries.NoFactoryFoundException: クラス android.app.Application のファクトリが見つかりませんでした。クラスに @Inject アノテーション付きコンストラクターがあるか、@Inject アノテーション付きメンバーが含まれていることを確認してください。レジストリを使用している場合は、それらが注釈プロセッサの引数で正しく設定されていることを確認してください。

私のフラグメント:

public class ApplicationMenu extends SidebarFragment {

@Inject ApplicationsService applicationsService;
@Inject SectionsService sectionsService;

private EventBus bus = EventBus.getDefault();

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Toothpick.inject(this, Toothpick.openScope(LauncherActivity.class)); // <- Erroring here       
}

...

}

アクティビティ:

public class LauncherActivity extends SidebarActivity {

...

@Override
protected void onCreate(Bundle savedInstanceState) {

    Scope scope = Toothpick.openScopes(LauncherApplication.class, LauncherActivity.class);
    scope.bindScopeAnnotation(LauncherActivitySingleton.class);
    scope.installModules(new LauncherActivityModule(this));
    super.onCreate(savedInstanceState);
    Toothpick.inject(this, scope);

    setContentView(R.layout.activity_launcher);
    ButterKnife.bind(this);

    ...
}

...

}

奇妙なことに、フラグメントでのみエラーが発生し、他の場所 (ViewRenderers、Adapters、Services など) のすべてのインジェクションは問題なく正常に動作します。

4

1 に答える 1

0

私はそれを理解しました。サービスの 1 つでアプリケーション スコープを誤って閉じてしまいました。そのサービスはフラグメントで使用されていたため、エラーが発生しました。

残念ながら、エラー メッセージからは有用な情報が得られず、問題を見つける唯一の方法は、すべてのコードを分析してデバッグすることです。

したがって、つまようじを使用すると、スコープのライフサイクルに非常に注意する必要があります。

于 2018-05-17T20:38:39.477 に答える