假设我有两个服务AService和BService,两者都需要 api 密钥。
所以在我的模块中,我不能做类似的事情:
@Provides @Singleton @A @ApiKey String provideAKey() { return "a"; }
@Provides @Singleton @B @ApiKey String provideBKey() { return "b"; }
Run Code Online (Sandbox Code Playgroud)
(Dagger 会抱怨“每个元素只允许有一个限定符注释”)。相反,我要做的是为每个组合定义两个单独的限定符:@ApiKeyA和@ApiKeyB。
对于具有多个依赖项的服务(例如网络客户端、请求标头等),为每个组合定义这些限定符而不是简单地组合不同的注释会变得很麻烦。
有没有明确禁止这样做的原因?
我正在尝试在我的 android 项目中使用 3 个 dagger2 编译器选项。但似乎它们都没有真正起作用。
我已将这里的代码粘贴到我的 gradle.properties 甚至 AS 设置的编译器选项中。
我感兴趣的 3 个是:
-Adagger.fastInit=enabled
-Adagger.formatGeneratedSource=disabled
-Adagger.gradle.incremental
Run Code Online (Sandbox Code Playgroud)
fastinit 和 codeformatting 只是不起作用(根据生成的代码判断),但增量会导致编译错误:
no compiler option found.
Run Code Online (Sandbox Code Playgroud)
我正在使用的版本是:
匕首:2.18
等级:5.2.1
科特林:1.3.21
android插件:3.3.1
当我迁移到 Androidx 时遇到此错误,仅发布版本。我尝试更新依赖项但不起作用。它在 androidx 之前运行良好。我不明白。谢谢您的帮助。当我迁移到 Androidx 时遇到此错误,仅发布版本。我尝试更新依赖项但不起作用。它在 androidx 之前运行良好。我不明白。谢谢您的帮助。
完全错误
java.lang.LinkageError: Method void com.kaznmx.app.kelime.features.gamehistory.GameHistoryViewModel.a() overrides final method in class Landroidx/lifecycle/ViewModel; (declaration of 'com.kaznmx.app.kelime.features.gamehistory.GameHistoryViewModel' appears in base.apk)
at com.kaznmx.app.kelime.WordSearchApp.onCreate(:2)
at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1155)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5940)
at android.app.ActivityThread.access$1100(ActivityThread.java:201)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1657)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6747)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:495)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Run Code Online (Sandbox Code Playgroud)
WordSearchApp 类
package com.kaznmx.app.kelime;
import android.app.Application;
import com.flurry.android.FlurryAgent;
import com.kaznmx.app.kelime.di.component.*;
import com.kaznmx.app.kelime.di.modules.AppModule;
import com.onesignal.OneSignal;
/**
* Created by abdularis on 18/07/17.
*/
public class WordSearchApp extends Application {
AppComponent mAppComponent;
@Override …Run Code Online (Sandbox Code Playgroud) 你好,我是匕首新手。我正在尝试学习,但在生成 AppComponent 类时遇到问题。这是我的AppComponent班级代码。我在 stackoverflow 中搜索了一些答案,但没有一个不起作用。
import EmsApplication
import android.app.Application
import com.example.emsapplication.utils.SessionManager
import dagger.BindsInstance
import dagger.Component
import dagger.android.AndroidInjector
import dagger.android.support.AndroidSupportInjectionModule
import javax.inject.Singleton
@Singleton
@Component(modules = \[AndroidSupportInjectionModule::class, ActivityBuildersModule::class, AppModule::class, ViewModelFactoryModule::class\])
interface AppComponent : AndroidInjector<EmsApplication>{
fun sessionManager(): SessionManager?
@Component.Builder
interface Builder {
@BindsInstance
fun application(application: Application?): Builder?
fun build(): AppComponent?
}
}
Run Code Online (Sandbox Code Playgroud)
error: cannot find symbol public abstract interface AppComponent extends dagger.android.AndroidInjector<EmsApplication>
Run Code Online (Sandbox Code Playgroud)
这是构建事件的输出。
我想用 Dagger2 注入一个 WorkManager 实例,以便在我的 ViewModel 中使用它,如下所示
class MyViewModel @Inject constructor(workManager: WorkManager) : ViewModel()
Run Code Online (Sandbox Code Playgroud)
当我尝试为 WorkManager 创建一个模块来提供它的实例时,我收到一条错误消息,指出我无法从抽象类提供。如何在我的 ViewModel 构造函数中注入 WorkManager 实例?
我有一个Car扩展类的类Vehicle,我将在车辆类中注入一些属性。
示例 编辑
abstract class Vehicle {
@Inject
lateinit var default: Default
}
class Car @Inject constructor(): Vehicle() {
}
Run Code Online (Sandbox Code Playgroud)
在我的代码中一切正常,
但我需要知道的一件事是,匕首如何将属性注入基类或其层次结构中?
这是正确的注射方式吗?
谁能澄清这一点吗?
它是否可以注入一个匿名类?我有以下错误:
java.lang.IllegalArgumentException:没有为members/com.acme.MyFragment $ 1注册注入.您必须将其显式添加到其中一个模块的"注入"选项中.
例:
public class MyFragment extends Fragment {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
new MyTrask(getActivity()) {
protected void onPostExecute(String result) {
// Stuff
}
}.execute();
}
}
public class MyTask extends AsyncTask<Void, Void, String> {
@Inject
UserApi userApi;
public MyTask(Context context) {
App.getInstance().inject(this);
}
@Override
protected String doInBackground(Void... params) {
return "Hello World!";
}
}
Run Code Online (Sandbox Code Playgroud) 我想在抽象类构造函数中注入接口实现并在子类中使用它.
我有编译时错误:
Error:Gradle: Dagger does not support injection into private fields
Error:Gradle: Example.A cannot be provided without an @Provides-annotated method.
Error:Gradle: Example.B cannot be provided without an @Inject constructor or from an @Provides-annotated method.
Error:Gradle: Execution failed for task ':app:compileDemoDebugJavaWithJavac'.
> Compilation failed; see the compiler error output for details.
Run Code Online (Sandbox Code Playgroud)
kotlin中的例子.
object Example {
interface IData {
fun foo() {
}
}
class Data : IData {
}
@Module
class DataModel {
@Provides
fun data(): IData = Data()
}
@Singleton …Run Code Online (Sandbox Code Playgroud) 我怎么能得到像光标一样的多个相同返回类型的实例
例如 :-
Module
@CursorScope
public class CursorModule {
@Provides
Cursor provideSongCursor(
@Named("Song") Musician musician) {
return musician.getApplicationContext().getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
new String[]{
BaseColumns._ID,
MediaStore.Audio.AudioColumns.TITLE,
MediaStore.Audio.AudioColumns.ARTIST,
MediaStore.Audio.AudioColumns.ALBUM,
MediaStore.Audio.AudioColumns.DURATION
}, MediaStore.Audio.AudioColumns.IS_MUSIC + "=1", null, null);
}
@Provides
Cursor provideAlbumCursor(
@Named("Album") Musician musician) {
return musician.getApplicationContext().getContentResolver().query(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI,
new String[]{
BaseColumns._ID,
MediaStore.Audio.AlbumColumns.ALBUM,
MediaStore.Audio.AlbumColumns.ARTIST,
MediaStore.Audio.AlbumColumns.NUMBER_OF_SONGS,
MediaStore.Audio.AlbumColumns.FIRST_YEAR
}, null, null, null);
}
@Provides
Cursor provideArtistCursor(@Named("Artist") Musician musician) {
return musician.getApplicationContext().getContentResolver().query(MediaStore.Audio.Artists.EXTERNAL_CONTENT_URI,
new String[] {
BaseColumns._ID,
MediaStore.Audio.ArtistColumns.ARTIST,
MediaStore.Audio.ArtistColumns.NUMBER_OF_ALBUMS,
MediaStore.Audio.ArtistColumns.NUMBER_OF_TRACKS
}, null, null,null);
}
@Provides
Cursor provideGenreCursor(
@Named("Genres") Musician musician) {
return …Run Code Online (Sandbox Code Playgroud) 从这里查看Android架构蓝图"todo-mvp-dagger":https://github.com/googlesamples/android-architecture.
我正在尝试理解Dagger2实现,我似乎无法弄清楚他们如何让Dagger2提供TasksRepository.
它们具有@Provides"provideTasksLocalDataSource"和"provideTasksRemoteDataSource",但实际TaskRepository的位置在哪里?
在TodoApplication类中,他们有:
@Inject
TasksRepository tasksRepository;
Run Code Online (Sandbox Code Playgroud)
怎么能在没有@Provides的情况下注入它呢?
如果我尝试在我自己的应用程序中使用相同的方法,我会收到此错误:
如果没有@ Provide-或@ Produces-annotated方法,则无法提供
所以我在Blueprints代码中到处寻找,但我看不出他们是如何做到的.是否有一些技巧允许他们没有@Provides?它肯定会建立起来,所以他们以某种方式绕过它.
有人在实际的github页面上问了同样的问题,但在撰写本文时没有答案.https://github.com/googlesamples/android-architecture/issues/561.
我在撰写本文时的最新提交是"082bd72d62472f9caadd2979046067fb928bbfef".