[Lesson18] Dagger

在 Dagger 里需要以下四大重要的 annotation:

  1. @Inject : 这其实是 Java 的物件,代表物件会被外部设定
  2. @Component : @Module 跟需要 dependency 的物件中间的桥梁
  3. @Module : 标注在 class 上,代表这个 class 包含着一到多个标注了 @Provide 的 function
  4. @Provide : 标注在 function 上,代表这个 function 会提供 dependency

在 build.gradle 向 dependencies 添加( https://github.com/google/dagger/releases 可以找到最新版本的 Dagger):

dependencies {
    implementation 'com.google.dagger:dagger:2.21'
    annotationProcessor 'com.google.dagger:dagger-compiler:2.21'
}

UserRepository:

public class UserRepository {
    private final UserLocalDataSource userLocalDataSource;
    private final UserRemoteDataSource userRemoteDataSource;

    @Inject
    public UserRepository(UserLocalDataSource userLocalDataSource, UserRemoteDataSource userRemoteDataSource) {
        this.userLocalDataSource = userLocalDataSource;
        this.userRemoteDataSource = userRemoteDataSource;
    }
}

UserLocalDataSource:

public class UserLocalDataSource {
    @Inject
    public UserLocalDataSource() {}
}

public class UserRemoteDataSource {
    private final LoginRetrofitService loginRetrofitService;

    @Inject
    public UserRemoteDataSource(LoginRetrofitService loginRetrofitService) {
        this.loginRetrofitService = loginRetrofitService;
    }
}

LoginViewModel:

public class LoginViewModel {
    private final UserRepository userRepository;

    @Inject
    public LoginViewModel(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
}

ApplicationComponent:

@Component(modules = NetworkModule.class)
public interface ApplicationComponent {
    // 注入 LoginActivity
    void inject(LoginActivity loginActivity);
}

MyApplication:

public class MyApplication extends Application {
    ApplicationComponent appComponent = DaggerApplicationComponent.create();
}

LoginActivity:

public class LoginActivity extends Activity {
    @Inject
    LoginViewModel loginViewModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ((MyApplication) getApplicationContext()).appComponent.inject(this);
        super.onCreate(savedInstanceState);
    }
}

NetworkModule:

@Module
public class NetworkModule {
    @Provides
    public LoginRetrofitService provideLoginRetrofitService() {
        return new Retrofit.Builder()
                .baseUrl("https://example.com")
                .build()
                .create(LoginService.class);
    }
}

谢谢大家愿意花时间阅读,小弟弟我在此鞠躬/images/emoticon/emoticon41.gif


<<:  android studio 30天学习笔记-day 18-viewPager

>>:  Day 18 - Isomorphic Strings

深不可测的海 - Regular Expression

使用终端机搜寻特定字串时,大家一定用过 grep 这个指令吧~ 但你有想过 grep 为什麽叫 gr...

离职倒数15天:我本来以为子宫是我的附属品,但该不会其实我就只是子宫的容器而已?

辞职前,最犹豫的一件事是「没请产假会不会太亏」,哈哈。几乎公司所有前辈都会劝你辞职前先做的事:买房跟...

自动化测试,让你上班拥有一杯咖啡的时间 | Day 1 - 前言

此系列文章会同步发文到个人部落格,有兴趣的读者可以前往观看喔。 嗨!我是卯郁,去年就立志今年要参加...

使用bot.py建立起你的第一个机器人

行前作业 注册帐号 需要有自己的服务器或是相应的权限 开始後续作业 搜寻discord develo...

Day 27 网路设置与远端

Day 27 网路设置与远端 网路及远端登入可能有先东西在先前已经介绍过,这边再稍微做个简单的范例。...