我意识到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>到字段注入,同时将其他非惰性依赖项保留在通过构造函数注入的同一类中?
感谢您的指点!
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
该示例存储库具有一种方法 public LiveData<Resource<List<Repo>>> loadRepos(String owner)
我的问题是为什么要将Android API(即android.arch.lifecycle.LiveData)添加到数据层?
将框架API与您的数据/实体混在一起不是一种反清洁的体系结构吗?
现在也不需要使用Robolectric进行单元测试RepoRepository吗?
android android-lifecycle android-livedata android-architecture-components
我正在从Dagger 2.11中探索新的dagger.android.我希望不必创建自定义范围注释@PerActivity.到目前为止,我能够做到以下几点:
1)定义应用程序范围单例并将它们注入活动.
2)定义活动范围非单例依赖关系,并使用它们将它们注入到它们的活动中 @ContributesAndroidInjector
我无法弄清楚的是如何使用它的应用程序范围Singleton和Activity范围非单例.
在下面的示例中,我想要我的活动范围MyActivityDependencyA并MyActivityDependencyB可以访问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 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 设置的精简版本。
我正在尝试使用新的导航组件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).noteId或arguments?.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
android ×3
android-architecture-components ×3
dagger ×3
dagger-2 ×3
android-architecture-navigation ×2
kotlin ×1