标签: dagger

Dagger项目在getApplication覆盖时无声地失败

我试图在IntelliJ中运行Dagger简单示例,但它在DemoBaseActivity类中的getApplication调用失败:

public abstract class DemoBaseActivity extends Activity {
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
    ((DemoApplication) getApplication()).inject(this);
  }
}
Run Code Online (Sandbox Code Playgroud)

当它达到注入方法时,应用程序会无声地失败而没有错误.我使用基类Activity的实例而不是DemoBaseActivity构建了项目,并且它部署得很好.

有什么想法吗?

编辑:

当Activity的getApplication()调用的返回值被转换为自定义DemoApplication类型时,它似乎正在破坏.

package com.badlogic.androidgames.simple;

import android.app.Application;
import dagger.ObjectGraph;

import java.util.Arrays;
import java.util.List;

    public class DemoApplication extends Application
    {
    private ObjectGraph graph;

    @Override
    public void onCreate()
    {
    super.onCreate();
    graph = ObjectGraph.create(getModules().toArray());
    }

    protected List<Object> getModules()
    {
    return Arrays.asList(new AndroidModule(this), new DemoModule());
    }

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

编辑:这是堆栈跟踪:

10-03 05:15:25.331:ERROR/AndroidRuntime(5035):FATAL EXCEPTION:main java.lang.RuntimeException:无法启动活动ComponentInfo {com.badlogic.androidgames.simple/com.badlogic.androidgames.simple.ui. HomeActivity}:java.lang.ClassCastException:android.app.Application无法在android.app.ActivityThread.handleLaunchActivity的android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211)上强制转换为com.badlogic.androidgames.simple.DemoApplication. (ActivityThread.java:2261)在Android.app.Handler.dispatchMessage(Handler)上的android.app.ActivityThread.access $ 600(ActivityThread.java:141)android.app.ActivityThread …

android intellij-idea dagger

4
推荐指数
1
解决办法
1501
查看次数

如何在IntelliJ中配置匕首

我下载了匕首,因为它似乎是Android中依赖注入的一个很好的选择.但是我在整合编译器时遇到了一些麻烦.是否有关于正确设置的提示?我按照关于android注释的说明进行操作,因为这个项目看起来很相似.但它对匕首不起作用.

我做了什么:我将dagger-1.1.0.jar和javax.inject-1.jar添加到我项目的lib文件夹中,并添加了一个名为"compile-libs"的新文件夹,其中包含"dagger-compiler-1.1.0.jar" "因为我不希望将此文件打包在*.apk中.

项目文件结构

我将dagger和javax.inject添加到模块的依赖项中.

现在棘手的部分:我将编译器添加到注释编译器设置:

设置

当我运行该程序时,我收到以下错误:无法加载类de.myproject.app.modules.AndroidModule的模块适配器.请确保为此模块运行代码生成.

所以在我看来代码生成并没有发生.另外,我项目中的"生成"文件夹是空的.那么在IntelliJ中让dagger在Android项目中工作的正确设置是什么?

android intellij-idea dagger

4
推荐指数
1
解决办法
2437
查看次数

Dagger:注入一个班级的不同实例

我可以使用Dagger将不同的值注入到对象图深处的同一个类的多个实例中吗?我想避免通过图中的包含对象传递值(因此我可以更改包含对象的实现而不影响其容器).

这是一个人为的例子.对象图是一个Top,它包含一个Left和Right,每个都包含一个Show.所以Show有两个实例.

class Top {
  Left left;
  Right right;
  void encodeTwice(String data) {
    left.encode(data);
    right.encode(data.getBytes());
  }
}
class Left {
  Leaf leaf;
  void encode(String data) {
    leaf.write(URLEncoder.encode(data));
  }
}
class Right {
  Leaf leaf;
  void encode(byte[] data) {
    leaf.write(DatatypeConverter.printBase64Binary(data));
  }
}
interface Leaf {
  void write(String data);
}
class Show implements Leaf {
  String label;
  @Override public void write(String data) {
    System.out.println(label + ": " + data);
  }
}
// There might be other classes that implement Leaf. …
Run Code Online (Sandbox Code Playgroud)

java dependency-injection nested dagger

4
推荐指数
1
解决办法
4197
查看次数

Google Auto Factory:未使用@Provided进行注释?

所以我正在尝试谷歌汽车工厂,但我得到一个奇怪的错误.

工厂类:

@AutoFactory(
    className = "MembersAdapterFactoryImpl"
)
public class MembersAdapter extends ArrayAdapter<Member> {

    /**
     * Get an instance of the helper
     */
    private MembersAdapterHelper mMembersAdapterHelper;

    public MembersAdapter(@Provided MembersAdapterHelper membersAdapterHelper,
                          Context context,
                          int resource,
                          List<Member> members){
        super(context, resource, members);
        mMembersAdapterHelper = membersAdapterHelper;
    }
}
Run Code Online (Sandbox Code Playgroud)

生成的类:

package me.magneto.groups.adapters;

import javax.annotation.Generated;
import javax.inject.Inject;
import javax.inject.Provider;
@Generated("com.google.auto.factory.processor.AutoFactoryProcessor")
public final class MembersAdapterFactoryImpl {
  private final Provider<MembersAdapterHelper> membersAdapterHelperProvider;
  @Inject
  public MembersAdapterFactoryImpl(Provider<MembersAdapterHelper> membersAdapterHelperProvider) {
    this.membersAdapterHelperProvider = membersAdapterHelperProvider;
  }
  public MembersAdapter create(android.content.Context context, int resource, java.util.List<me.magneto.groups.models.group.Member> members) { …
Run Code Online (Sandbox Code Playgroud)

java android guice dagger

4
推荐指数
1
解决办法
3619
查看次数

Dagger2在依赖模块中注入@Named @Provides?

我使用https://guides.codepath.com/android/Dependency-Injection-with-Dagger-2的 dagger2演示.我想使用缓存和非缓存的改进调用.我在NetModule.java中创建

@Provides @Named("cached")
@Singleton
OkHttpClient provideOkHttpClient(Cache cache) {
    OkHttpClient okHttpClient = new OkHttpClient.Builder()
            .cache(cache)
            .build();
    return okHttpClient;
}

@Provides @Named("non_cached")
@Singleton
OkHttpClient provideOkHttpClientNonCached() {
    OkHttpClient okHttpClient = new OkHttpClient.Builder()
            .build();
    return okHttpClient;
}
Run Code Online (Sandbox Code Playgroud)

GitHubModule.java依赖于NetModule.java.我的GitHubComponent.java

@UserScope
@Component(dependencies = NetComponent.class, modules = GitHubModule.class)
public interface GitHubComponent {
void inject(DemoDaggerActivity activity);
}
Run Code Online (Sandbox Code Playgroud)

我的NetComponent.java

@Singleton
@Component(modules={ApplicationModule.class, NetModule.class})
public interface NetComponent {
// downstream components need these exposed
Retrofit retrofit();
OkHttpClient okHttpClient();
SharedPreferences sharedPreferences();
}
Run Code Online (Sandbox Code Playgroud)

在我的DemoDaggerActivity.java注入改造中:

@Inject @Named("cached")
OkHttpClient mOkHttpClient;

@Inject …
Run Code Online (Sandbox Code Playgroud)

java android dependency-injection dagger dagger-2

4
推荐指数
1
解决办法
4615
查看次数

匕首2:必须设置模块

我是Dagger 2的新手,我已经尝试设置相同的工具。这是我的ActivityModule

@Module
public abstract class ActivityModule {
    @ContributesAndroidInjector
    abstract ProductListActivity contributeProductListActivity();

    @ContributesAndroidInjector
    abstract ProductDetailsActivity contributeProductDetailsActivity();
}
Run Code Online (Sandbox Code Playgroud)

我的AppModule

@Module
class AppModule {

@Provides
    @Singleton
    RedMartProductService provideRedMartProductService() {
        ........
    }
    ........
    .......
}
Run Code Online (Sandbox Code Playgroud)

我的AppComponent

@Singleton
@Component(modules = {AndroidInjectionModule.class, ActivityModule.class, AppModule.class})
public interface AppComponent {
    @Component.Builder
    interface Builder {
        @BindsInstance
        Builder application(Application application);

        AppComponent build();
    }

    void inject(MartApplication martApp);
}
Run Code Online (Sandbox Code Playgroud)

我的申请

public class MartApplication extends Application implements HasActivityInjector {

    @Inject
    DispatchingAndroidInjector<Activity> dispatchingAndroidInjector;

    @Override
    public …
Run Code Online (Sandbox Code Playgroud)

android dagger dagger-2

4
推荐指数
1
解决办法
1905
查看次数

Dagger 2:在构造函数中注入一个接口

我正在尝试学习匕首2,但我对使用接口注入构造函数感到困惑.这是我的下面的代码:

MainActivity.java

public class MainActivity extends AppCompatActivity implements MainView {

    // this keyword of request dependency . At compiling process, dagger will look at all of these annotations
    //to create the exact dependency

    @Inject MainPresenter mainPresenter ;
    TextView textView ;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = findViewById(R.id.textview) ;
        DaggerPresenterComponent.create().inject(this);
        textView.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                mainPresenter.doThings(8555) ;
            }
        });

    }

    /**********************************/

    @Override
    public void invokeRandomViewMethod(String msg) {
        textView.setText(msg);
    }
}
Run Code Online (Sandbox Code Playgroud)

MainPresenter.java

public class …
Run Code Online (Sandbox Code Playgroud)

java android dependency-injection dagger dagger-2

4
推荐指数
1
解决办法
2181
查看次数

Dagger 2 - 使用自定义范围时,依赖关系不是单例

我有自定义范围:

@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface PerActivity { }
Run Code Online (Sandbox Code Playgroud)

和使用此批注的组件:

@PerActivity
@Component(modules = {ActivityModule.class}, dependencies = AppComponent.class)
public interface ActivityComponent {

    void inject(MainActivity mainActivity);

}
Run Code Online (Sandbox Code Playgroud)

和提供MainPresenter依赖关系的模块:

@Module
public class ActivityModule {

    @PerActivity
    @Provides
    public MainPresenter provideMainPresenter(){
        return new MainPresenter();
    }

}
Run Code Online (Sandbox Code Playgroud)

这是MainPresenter注入的MainActivity:

public class MainActivity extends AppCompatActivity implements MainView {

    @PerActivity
    @Inject
    MainPresenter mainPresenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        DaggerActivityComponent.builder()
                .appComponent(DaggerAppComponent.builder().build())
                .build()
                .inject(this);

    }

}
Run Code Online (Sandbox Code Playgroud)

我的问题:在配置更改(方向更改)后重新创建演示者.

我的问题:如何让它只为一个活动创建一次?

android dagger dagger-2

4
推荐指数
1
解决办法
612
查看次数

CustomScope可能不会引用具有不同范围的绑定

我是匕首的新手,我已经定义了这样的应用程序组件

@Singleton
@Component(modules = {ApplicationModule.class})
public interface ApplicationComponent {
    void inject(BaseActivity activity);
    Context context();
}
Run Code Online (Sandbox Code Playgroud)

这是我的ApplicationModule

@Module
public class ApplicationModule {

    public TipoApplication application;

    public ApplicationModule(TipoApplication application) {
        this.application = application;
    }

    @Singleton
    @Provides
    public Context provideContext(){return application.getApplicationContext();}

    @Singleton
    @Provides
    public SharedPreferences provideSharedPreferences(Context context){
        return PreferenceManager.getDefaultSharedPreferences(context);
    }

    @Singleton
    @Provides
    public Gson provideGson(){
        return new Gson();
    }

    @Singleton
    @Provides
    public SharedPrefsManager provideSharedPrefsManager(SharedPreferences sharedPreferences, Gson gson){
        return new SharedPrefsManager(sharedPreferences, gson);
    }
}
Run Code Online (Sandbox Code Playgroud)

我创建了一个依赖的组件LocationProviderComponent

@LocationScope
@Component(dependencies = {ApplicationComponent.class},modules = {LocationProviderModule.class})
public interface LocationProviderComponent …
Run Code Online (Sandbox Code Playgroud)

android dependency-injection dagger android-studio dagger-2

4
推荐指数
1
解决办法
2554
查看次数

Dagger Android可以自定义类吗?

我正在尝试使用Conductor(或任何自定义类)进行dagger-android工作.我尝试复制AndroidSupportInjectionModule(和朋友)所做的一切,在我看来,这是一种自定义类处理.

但是我得到了

C:\Users\ursus\AndroidStudioProjects\...\ControllersModule.java:15: error: com.foo.bar.ChannelsController is not a framework type
    public abstract com.foo.bar.ChannelsController channelsController();
Run Code Online (Sandbox Code Playgroud)

所以,我的"库"代码

package com.foo.bar

import com.bluelinelabs.conductor.Controller;
import dagger.Module;
import dagger.android.AndroidInjectionModule;
import dagger.android.AndroidInjector;
import dagger.internal.Beta;
import dagger.multibindings.Multibinds;

import java.util.Map;

@Beta
@Module(includes = AndroidInjectionModule.class)
public abstract class ConductorInjectionModule {

    private ConductorInjectionModule() {
    }

    @Multibinds
    abstract Map<Class<? extends Controller>, AndroidInjector.Factory<? extends Controller>> controllerInjectorFactories();

    @Multibinds
    abstract Map<String, AndroidInjector.Factory<? extends Controller>> controllerInjectorFactoriesWithStringKeys();
}
Run Code Online (Sandbox Code Playgroud)

我甚至没有编译,所以假设粘贴ConductorInjection和HasControllerInjector毫无意义

用法:

@Module
abstract class AppModule {
    @ContributesAndroidInjector abstract fun mainActivity(): MainActivity
    @ContributesAndroidInjector abstract fun channelsController(): ChannelsController
}

class …
Run Code Online (Sandbox Code Playgroud)

android dagger dagger-2

4
推荐指数
1
解决办法
416
查看次数