小编lim*_*nal的帖子

构造函数注入期间 Dagger Lazy

我意识到Lazy使用 Dagger 完成注入的推荐方法是添加Lazy到字段注入点。例如,

class Foo {
    @Inject lateinit var bar: Lazy<Bar>

    fun useBar() = bar.get().doSomething()
}
Run Code Online (Sandbox Code Playgroud)

使用构造函数注入怎么样?我还没有看到有人这样做。

class Foo @Inject constructor(private val fizz: Fizz,
                              private val bar: Lazy<Bar>) {    
    fun useBar() = bar.get().doSomething()
}
Run Code Online (Sandbox Code Playgroud)

总结一下,在进行 Dagger 延迟注入时,我可以Lazy<Bar>在构造函数中使用吗?或者我唯一的选择是转移Lazy<Bar>到字段注入,同时将其他非惰性依赖项保留在通过构造函数注入的同一类中?

感谢您的指点!

lazy-initialization kotlin dagger dagger-2

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

View.findNavController()与Fragment.findNavController()

NavHostFragment我可以做的任何地方findNavController().navigateUp()

或者,如果在“片段”中有一个用于导航的按钮,则可以执行以下任一操作:

editButton.setOnClickListener { v ->
    v.findNavController().navigateUp()
}
Run Code Online (Sandbox Code Playgroud)

要么

editButton.setOnClickListener {
    findNavController().navigateUp()
}
Run Code Online (Sandbox Code Playgroud)

在Fragment中设置按钮单击侦听器时,为什么要使用一个扩展功能而不使用另一个扩展功能?

android-architecture-components android-jetpack android-architecture-navigation

6
推荐指数
1
解决办法
4083
查看次数

从存储库返回LiveData

该示例存储库具有一种方法 public LiveData<Resource<List<Repo>>> loadRepos(String owner)

https://github.com/googlesamples/android-architecture-components/blob/master/GithubBrowserSample/app/src/main/java/com/android/example/github/repository/RepoRepository.java

我的问题是为什么要将Android API(即android.arch.lifecycle.LiveData)添加到数据层?

将框架API与您的数据/实体混在一起不是一种反清洁的体系结构吗?

现在也不需要使用Robolectric进行单元测试RepoRepository吗?

android android-lifecycle android-livedata android-architecture-components

5
推荐指数
1
解决办法
1557
查看次数

Dagger 2.11 ContributesAndroidInjector Singleton依赖注入失败

我正在从Dagger 2.11中探索新的dagger.android.我希望不必创建自定义范围注释@PerActivity.到目前为止,我能够做到以下几点:

1)定义应用程序范围单例并将它们注入活动.

2)定义活动范围非单例依赖关系,并使用它们将它们注入到它们的活动中 @ContributesAndroidInjector

我无法弄清楚的是如何使用它的应用程序范围Singleton和Activity范围非单例.

在下面的示例中,我想要我的活动范围MyActivityDependencyAMyActivityDependencyB可以访问SingletonMyActivityService

以下设置导致:

错误:(24,3)错误:com.example.di.BuildersModule_BindMyActivity.MyActivitySubcomponent(unscoped)可能不引用作用域绑定:@Singleton @Provides com.example.MyActivityService com.example.MyActivitySingletonsModule.provideMyActivityService()

这是我的设置.注意,我定义了单独的MyActivitySingletonsModule, MyActivityModule因为我不能在同一个Module文件中混合使用Singleton和非Singleton依赖项.

@Module
public abstract class BuildersModule {
    @ContributesAndroidInjector(modules = {MyActivitySingletonsModule.class, MyActivityModule.class})
    abstract MyActivity bindMyActivity();
    }
}
Run Code Online (Sandbox Code Playgroud)

@Module
public abstract class MyActivityModule {
    @Provides
    MyActivityDependencyA provideMyActivityDependencyA(MyActivityService myActivityService){
       return new MyActivityDependencyA(myActivityService);
    }
    @Provides
    MyActivityDependencyB provideMyActivityDependencyB(MyActivityService myActivityService) {
        return new MyActivityDependencyB(myActivityService);
    }
}
Run Code Online (Sandbox Code Playgroud)

@Module
public abstract class MyActivitySingletonsModule {
    @Singleton
    @Provides
    MyActivityService provideMyActivityService() {
        return new MyActivityService();
    } …
Run Code Online (Sandbox Code Playgroud)

dagger dagger-2

3
推荐指数
1
解决办法
3896
查看次数

迁移到 Dagger 2.12 并测试模块覆盖

我正在从 Dagger 2.0.2 迁移到 Dagger 2.12 并计划使用dagger.androidAPI。

我的问题是关于迁移测试代码。目前,我有一个AppModule和一个TestAppModule,它扩展了它并使用@Override注释覆盖了一些依赖项。下面是一个例子:

@Module
public class TestAppModule extends AppModule {

    @Override
    public UserDao provideUserDao() {
        return mock(UserDao.class);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在使用 Dagger 2.12,如果我尝试覆盖 中的依赖项 TestAppModule,则会引发错误:error: @Provides methods may not be overridden in modules.

使用原样定义的其余依赖项在一段TestModule时间内覆盖和模拟某些依赖项的推荐方法AppModule是什么?

如果人们认为有必要,我可以发布我的 Dagger 设置的精简版本。

android dagger dagger-2

3
推荐指数
1
解决办法
573
查看次数

导航Arch组件:为Deeplink传递占位符参数

我正在尝试使用新的导航组件API v1.0.0-alpha05实现深层链接功能,但遇到了问题。

使用Android Studio 3.3 Canary 7

我的navigation_graph.xml的一部分

<fragment
    android:id="@+id/noteDetailFragment"
    android:name="com.myapp.notes.notedetail.NoteDetailFragment"
    android:label="@string/label_note_detail"
    tools:layout="@layout/note_detail_fragment">

    <argument
        android:name="noteId"
        android:defaultValue="0"
        app:argType="integer" />

    <action
        android:id="@+id/action_noteDetail_to_editNote"
        app:destination="@id/editNoteFragment" />

    <deepLink
        android:id="@+id/noteDetailDeepLink"
        app:uri="notesapp://notes/{noteId}" />
</fragment>
Run Code Online (Sandbox Code Playgroud)

AndroidManifest.xml包含:

    <activity android:name=".presentation.MainActivity">
        <nav-graph android:value="@navigation/navigation_graph" />
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
Run Code Online (Sandbox Code Playgroud)

我正在测试我的深层链接 adb shell am start -a android.intent.action.VIEW -d "notesapp://notes/2" com.myapp.notes

noteId是不存在于任一NoteDetailFragmentArgs.fromBundle(arguments).noteIdarguments?.getInt("noteId", 0)(的默认值0在两种情况下被返回)

打印出捆绑包表明它在那里:

[{android-support-nav:controller:deepLinkIntent=Intent { act=android.intent.action.VIEW dat=notesapp://notes/2 flg=0x1000c000 pkg=com.mynotes.notes cmp=com.mynotes.notes.presentation.MainActivity }, noteId=2}]

如果Deeplink uri是 http://www.mynotes.com/notes/2

noteId深层链接时如何访问?谢谢!

android android-architecture-components android-architecture-navigation

3
推荐指数
1
解决办法
892
查看次数