标签: dagger

Dagger for Android:在调用setContentView后向对象图中注入一个Activity

我想在Android上使用Dagger将一个实例Activity注入另一个类,如下所示:

class PresentationLayer{
    Activity mActivity;

    @Inject
    public PresentationLayer(Activity activity){
        this.mActivity = activity;
    }

    public void presentData(User user){
        ((TextView)mActivity.findViewById(R.id.username))
            .setText(user.getName());
        //...
        //...
    }
}
Run Code Online (Sandbox Code Playgroud)

我能够做的注入,但对所有领域Activitynull在注射时间.

这是我如何进行注射:

Activity本身就是一个模块.

@Module(
    complete = false
)
class MainActivity extends Activity{

    @Override
    public void onCreate(Bundle bundle){
        super.onCreate(bundle);
        setContentView(R.layout.main_activity);
        ObjectGraph objectGraph = CustomApplication.getObjectGraph();
        PresentationLayer pres = objectGraph.get(PresentationLayer.class);
    }

    @Provides Activity provideActivity(){
        return this;
    }


}
Run Code Online (Sandbox Code Playgroud)

这是我的主要模块

@Module(
    entryPoints = PresentationLayer.class,
    includes = MainActivity.class
)
class DaggerModule{
    @Provides PresentationLayer …
Run Code Online (Sandbox Code Playgroud)

java android dependency-injection dagger

8
推荐指数
1
解决办法
1万
查看次数

匕首和嵌套注射

我正在使用Dagger将依赖项注入到Android应用程序中,我偶然发现了一个问题,我不确定如何以一种干净的方式解决问题.

我试图实现的是实现帮助并将其注入我的活动中,并让这些帮助者也包含注入的成员.

什么有效

我的助手注入的活动:

public class MyActivity extends Activity {
    @Inject SampleHelper helper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ((MyApplication) getApplication()).inject(this);

        Log.i("debug", "helper = " + helper);
        Log.i("debug", "helper context = " + helper.context);
    }
}
Run Code Online (Sandbox Code Playgroud)

创建对象图的应用程序:

public class MyApplication extends Application {
    private ObjectGraph graph;

    @Override
    public void onCreate() {
        super.onCreate();

        graph = ObjectGraph.create(getModules());
    }

    private Object[] getModules() {
        return new Object[] { new MyModule(this) };
    }

    public void inject(Object target) {
        graph.inject(target);
    }
}
Run Code Online (Sandbox Code Playgroud)

当我直接实例化SampleHelper类时,注入工作非常完美,而SampleHelper类又接收注入的应用程序上下文: …

android dependency-injection dagger

8
推荐指数
1
解决办法
5635
查看次数

dagger不能注入类型参数字段

我正在研究一个Android应用程序,我正在尝试注入一个在抽象类中参数化的字段:BaseListFragment

public abstract class BaseListFragment<E, A extends ArrayAdapter<E>, S> extends BaseFragment
{
    @Inject protected S service;
}
Run Code Online (Sandbox Code Playgroud)

但是我在编译时遇到以下错误:错误:找不到符号类S.

这是我的BaseFragment代码:

public class BaseFragment extends Fragment
{
    @Override public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        ((App) getActivity().getApplication()).inject(this);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的服务模块:

@Module(
        complete = false,
        library = true
)
public class ServiceModule
{
    @Provides @Singleton BucketService provideBucketService(RestAdapter restAdapter)
    {
        return restAdapter.create(BucketService.class);
    }

    @Provides @Singleton ProjectService provideProjectService(RestAdapter restAdapter)
    {
        return restAdapter.create(ProjectService.class);
    }

    @Provides @Singleton ShotService provideShotService(RestAdapter restAdapter)
    {
        return restAdapter.create(ShotService.class);
    }

    @Provides @Singleton TeamService provideTeamService(RestAdapter …
Run Code Online (Sandbox Code Playgroud)

android dependency-injection dagger dagger-2

8
推荐指数
1
解决办法
3649
查看次数

它是如何工作的@BindsInstance dagger 2

我最近更新了匕首2.8到2.9匕首.并添加了上一版本的文档,如下所示:

- @BindsInstance为组件构建器添加了轻松绑定在图外部构造的实例.

- 生产者:添加ProducerMonitor.ready (),当所有生产者的输入都可用时调用.

- 删除@Provides(type =...)用法.dagger.multibindings而是使用注释.@Produces.type也被删除了.

- 现在验证所有绑定方法,即使它们在特定用途中未使用 @Component

- @Component.dependencies不能再包括了@Modules.

我想知道这些新功能如何:

谢谢!!

注意:我是dagger 2的新手,但您希望能够最大限度地利用此库.

dagger dagger-2

8
推荐指数
1
解决办法
8801
查看次数

将Dagger2与Lombok一起使用

有没有人将Lombok 1.16与Dagger2一起使用?

我当前的代码如下:

@AllArgsConstructor(onConstructor = @__(@Inject))
public class JuiceMaker {
    private final Apple apple;
Run Code Online (Sandbox Code Playgroud)

错误是:

JuiceMaker cannot be provided without an @Inject constructor or from an @Provides-annotated method.
Run Code Online (Sandbox Code Playgroud)

如果没有Lombok批注,这实际上可以工作,因此:

public class JuiceMaker {
    private final Apple apple;
    @Inject
    public JuiceMaker(Apple apple){
        this.apple = apple
    }
}
Run Code Online (Sandbox Code Playgroud)

作品

lombok dagger dagger-2

8
推荐指数
2
解决办法
1194
查看次数

没有Dagger2为JUnit测试生成文件

新的AndroidStudio 1.1版本引入了单元测试支持.此URL http://tools.android.com/tech-docs/unit-testing-support提供了如何设置IDE以运行Android源的JUnit测试的分步说明.

这个插件https://bitbucket.org/hvisser/android-apt用于向AS提供Dagger2生成的文件,它适用于通常的Android代码,但不幸的是,没有为任何JUnit测试类生成Dagger2文件.我试着像配置依赖

androidTestApt 'com.google.dagger:dagger-compiler:2.0-SNAPSHOT'

根据android-apt插件文档但没有成功.

我认为问题出在单元测试的不同源目录中 - src/test/java而不是src/androidTest/javaandroid检测所使用的.

您能否提供任何帮助或信息如何解决这个问题?

android dependency-injection dagger dagger-2

7
推荐指数
1
解决办法
968
查看次数

Dagger 2中@Reusable范围的用途是什么?

我正在努力了解@ReusableDagger范围的使用.从文档中我可以理解的是,如果提供程序的作用域@Singleton或任何其他自定义作用域,则首先创建对象,然后在组件的整个生命周期中对其进行高速缓存.因此,对于并不总是需要相同实例或不经常使用的对象,这种方法最终会浪费内存.

但是如果我们选择一个非范围的提供者,每次它都会创建一个新实例,并且由于对象实例化很昂贵,特别是在Android等环境中,分配可能很昂贵,这可能会导致性能问题.

@Reusable范围位于无范围和范围实例之间.从文档中

有时您希望限制实例化@Inject构造的类或调用@Provides方法的次数,但您不需要保证在任何特定组件或子组件的生命周期中使用完全相同的实例

它是如何工作的?假设我有一个可重用的提供程序,AppComponent它不会总是给我相同的实例吗?

如果我在任何中注入相同的依赖项Subcomponent,我将获得相同的实例吗?什么时候将为GC释放缓存的对象?

我尝试了一个示例,@Reusable在我的AppComponent模块中创建一个对象并从我的子组件中注入相同的对象.
我能看到的是它的表现完全一样@Singleton.

我们可以从中获得哪些性能改进@Reusable

我们应该选择哪些可能的用例@Reusable

将所有无状态对象(无论我们是否获得相同的实例)都包括在内,例如Util类,Gson,Glide等,这是一个好主意@Reusable吗?

android dagger dagger-2

7
推荐指数
1
解决办法
1272
查看次数

“使用作用域绑定或声明重复模块..使用作用域:@javax.inject.Singleton” Dagger 2

我正在我的测试项目中尝试 Hilt DI。我在 SingletonComponent 中安装了以下模块,就 Android 而言,它是 applicationComponent。但是,当我尝试使用 @Singleton 来确定提供方法的范围时,出现以下错误。

MyApplication_HiltComponents.ViewModelC repeats modules with scoped bindings or declarations:
  public abstract static class SingletonC implements MyApplication_GeneratedInjector,
                         ^
    - com.test.catalogue.presentation.application.MyApplication_HiltComponents.SingletonC also includes:
      - com.test.catalogue.di.modules.RetrofitModule with scopes: @javax.inject.Singleton
Run Code Online (Sandbox Code Playgroud)

以下是我的模块声明。

改造模块:

@Module(includes = {OKHttpModule.class})
@InstallIn(SingletonComponent.class)
public class RetrofitModule {

    @Provides
    @Singleton
    public MyApi providesAPI(Retrofit retrofit) {
        return retrofit.create(MyApi.class);
    }

    @Provides
    @Singleton
    public Retrofit providesRetrofit(OkHttpClient okHttpClient, GsonConverterFactory gsonConverterFactory, LiveDataAdapterFactory liveDataAdapterFactory) {
        return new Retrofit.Builder()
                .client(okHttpClient)
                .addCallAdapterFactory(liveDataAdapterFactory)
                .addConverterFactory(gsonConverterFactory)
                .baseUrl(BuildConfig.API_URL)
                .build();
    }

    @Provides
    public GsonConverterFactory providesGsonConverterFactory() { …
Run Code Online (Sandbox Code Playgroud)

java android dependency-injection dagger dagger-hilt

7
推荐指数
0
解决办法
1269
查看次数

Dagger Hilt:父/子片段的范围依赖关系

我正在尝试找到如何在特定片段相关场景中定义 Hilt 的解决方案。我有以下设置:

  • 活动
    • 父片段 1
      • 子片段 1
      • 子片段2
      • ...
      • 子片段 n-1
    • 父片段 2
      • 子片段 1
      • 子片段2
      • ...
      • 子片段 n-1

父片段 1 使用依赖项 A。我只想在该父片段及其所有子片段之间共享该依赖项的实例。父片段 2 + 其子片段应使用与父片段 1 + 子片段不同的实例。一般来说,他的结构应该只有任何给定依赖关系的两个实例 - 一个用于第一个流,一个用于第二个流。

我可以看到自定义范围可能在这里工作,但我不确定如何在 Hilt 中使用它。

android android-fragments dagger dagger-2 dagger-hilt

7
推荐指数
1
解决办法
1442
查看次数

默认 FirebaseApp 在此过程中未初始化...请确保首先调用 FirebaseApp.initializeApp(Context)

我正在尝试将数据添加到 firestore。我也想用匕首来做到这一点。但我不断收到此错误。你能帮我吗......

** 默认 FirebaseApp 在此进程 com.example.vvvv 中未初始化。确保首先调用 FirebaseApp.initializeApp(Context)。**

Firestore存储库

class FirestoreRepository @Inject constructor(private val usersRef: 
CollectionReference) {

fun saveSearchResults(userEntities: List<UserEntity>) {
    usersRef.add(userEntities).addOnCompleteListener { task ->
        when (task.isSuccessful) {
            true ->  Log.d(ContentValues.TAG, "added:success")
            false ->  Log.d(ContentValues.TAG, "added:unsuccess")
        }
    }
  }
 }
Run Code Online (Sandbox Code Playgroud)

视图模型

@HiltViewModel
class UserListViewModel @Inject constructor(private val repository: RoomRepository, private 
val firestoreRepository: FirestoreRepository) :
ViewModel() {

private val _users = MutableLiveData<List<User>>()

val users: LiveData<List<User>>
    get() = _users

var userData: MutableLiveData<List<User>> = MutableLiveData()

fun userSearch(term: String) {
    viewModelScope.launch {
        loadFromCache(term) …
Run Code Online (Sandbox Code Playgroud)

kotlin firebase dagger google-cloud-firestore

7
推荐指数
1
解决办法
2万
查看次数