我在kotlin活动中使用ViewPager,我希望在Kotlin Fragment中使用匕首注射.我有错误:Dagger不支持注入私有字段.在Java Fragment中匕首注射工作.为什么我不能在kotlin片段中注入匕首?
在我的kotlin活动中
mPagerAdapter = object : FragmentPagerAdapter(supportFragmentManager) {
private val mFragments = arrayOf(KotlinFragment(), JavaFragment())
private val mFragmentNames = arrayOf(getString(R.string.cashdocuments), getString(R.string.action_absmysql))
override fun getItem(position: Int): Fragment {
return mFragments[position]
}
override fun getCount(): Int {
return mFragments.size
}
override fun getPageTitle(position: Int): CharSequence {
return mFragmentNames[position]
}
}
Run Code Online (Sandbox Code Playgroud)
我的kotlin片段
class KotlinFragment : Fragment() {
@Inject
internal var mSharedPreferences: SharedPreferences? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
(activity.application as SamfantozziApp).dgaeacomponent().inject(this)
}
override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?,
savedInstanceState: Bundle?): …Run Code Online (Sandbox Code Playgroud) 我使用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) 我使用https://medium.com/@iammert/new-android-injector-with-dagger-2-part-1-8baa60152abe的 dagger2演示.我已将SharedPreferences添加到AppModule.java中
@Module(subcomponents = {
MainActivityComponent.class,
DetailActivityComponent.class,
Detail2ActivityComponent.class})
public class AppModule {
@Provides
@Singleton
Context provideContext(Application application) {
return application;
}
@Provides
@Singleton //if i remove dagger works right
SharedPreferences providesSharedPreferences(Application application) {
return PreferenceManager.getDefaultSharedPreferences(application);
}
}
Run Code Online (Sandbox Code Playgroud)
我在MainActivity中注入SharedPreferences.重建项目后,我收到错误
如果我通过provideSharedPreferences删除注释@Singleton,则项目重建正确.为什么问题@Singleton注释由provideSharedPreferences?
我使用New Android Injector和Dagger 2通过https://medium.com/@iammert/new-android-injector-with-dagger-2-part-1-8baa60152abe
在MultiDex支持之前,App已经发挥作用.我已经为app/build.gradle和AndroidManifest.xml添加了multidex支持.在MultiDex支持之后,我通过安装在设备上获得了错误logcat
致命异常:主java.lang.RuntimeException:无法启动活动ComponentInfo {com.eusecom.samfantozzi/com.eusecom.samfantozzi.Detail2Activity}:java.lang.RuntimeException:android.support.multidex.MultiDexApplication未实现dagger.android .AasActivityInjector在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2295)的android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2349)在android.app.ActivityThread.access $ 700(ActivityThread.java:159)在android .app.ActivityThread $ H.handleMessage(ActivityThread.java:1316)位于android.app的android.os.Handler.dispatchMessage(Handler.java:99)android.os.Looper.loop(Looper.java:137). ActivityThread.main(ActivityThread.java:5419)位于java.lang.reflect.Method.invokeNative(Native Method),位于com.android.internal.os的java.lang.reflect.Method.invoke(Method.java:525).在dalvik的com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)的ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1187).system.NativeStart.main(Native Method)引起:java.lang.RuntimeException:android.support.multidex.MultiDexApplication没有在dagger.android.AndroidInjection.inject(AndroidInjection.java:48)中实现dagger.android.HasActivityInjector com.usecom.samfantozzi.Detail2Activity.onCreate(Detail2Activity.java:19)在android.app.Isttrumentation.callActivityOnCreate(Instrumentation.java:1104)的android.app.Activity.performCreate(Activity.java:5372)android.app Android.app.ActivityThread $ H的android.app.ActivityThread.access $ 700(ActivityThread.java:159)android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2349)的.ActivityThread.performLaunchActivity(ActivityThread.java:2257) .handleMessage(ActivityThread.java:1316)在android.app.Handler.dispatchMessage(Handler.java:99)android.app.Looper.loop(Looper.java:137)android.app.ActivityThread.main(ActivityThread. java:5419)在java.lang.reflect.Method.invo的java.lang.reflect.Method.invokeNative(Native Method)ke(Method.java:525)位于dalvik的com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1187)com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003) .system.NativeStart.main(Native方法)
我的App.java
public class SamfantozziApp extends MultiDexApplication implements HasActivityInjector {
@Inject
DispatchingAndroidInjector<Activity> activityDispatchingAndroidInjector;
public RxBus _rxBus;
@NonNull
private DatabaseReference mDatabaseReference;
@Override
public void onCreate() {
super.onCreate();
if (LeakCanary.isInAnalyzerProcess(this)) {
// This process is dedicated to LeakCanary for heap analysis.
// You should not init your app in this process.
return; …Run Code Online (Sandbox Code Playgroud)