मैं अपने प्रोजेक्ट में डैगर 2 को जोड़ने की कोशिश कर रहा हूं। मैं अपने टुकड़ों के लिए ViewModels (AndroidX आर्किटेक्चर घटक) को इंजेक्ट करने में सक्षम था।
मेरे पास एक ViewPager है जिसमें एक ही टुकड़े के 2 उदाहरण हैं (प्रत्येक टैब के लिए केवल एक मामूली बदलाव) और प्रत्येक टैब में, मैं LiveData
डेटा परिवर्तन (एपीआई से) पर अपडेट होने के लिए देख रहा हूं ।
मुद्दा यह है कि जब एपीआई प्रतिक्रिया आती है और अपडेट करती है LiveData
, तो वर्तमान में दृश्यमान टुकड़े में समान डेटा सभी टैब में पर्यवेक्षकों को भेजा जा रहा है। (मुझे लगता है कि यह शायद इस दायरे के कारण है ViewModel
)।
यह मैं अपने डेटा का अवलोकन कर रहा हूं:
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
activityViewModel.expenseList.observe(this, Observer {
swipeToRefreshLayout.isRefreshing = false
viewAdapter.setData(it)
})
....
}
मैं इस वर्ग का उपयोग ViewModel
एस प्रदान करने के लिए कर रहा हूँ :
class ViewModelProviderFactory @Inject constructor(creators: MutableMap<Class<out ViewModel?>?, Provider<ViewModel?>?>?) :
ViewModelProvider.Factory {
private val creators: MutableMap<Class<out ViewModel?>?, Provider<ViewModel?>?>? = creators
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
var creator: Provider<out ViewModel?>? = creators!![modelClass]
if (creator == null) { // if the viewmodel has not been created
// loop through the allowable keys (aka allowed classes with the @ViewModelKey)
for (entry in creators.entries) { // if it's allowed, set the Provider<ViewModel>
if (modelClass.isAssignableFrom(entry.key!!)) {
creator = entry.value
break
}
}
}
// if this is not one of the allowed keys, throw exception
requireNotNull(creator) { "unknown model class $modelClass" }
// return the Provider
return try {
creator.get() as T
} catch (e: Exception) {
throw RuntimeException(e)
}
}
companion object {
private val TAG: String? = "ViewModelProviderFactor"
}
}
मैं अपना बंधन ViewModel
इस तरह बांध रहा हूं :
@Module
abstract class ActivityViewModelModule {
@MainScope
@Binds
@IntoMap
@ViewModelKey(ActivityViewModel::class)
abstract fun bindActivityViewModel(viewModel: ActivityViewModel): ViewModel
}
मैं @ContributesAndroidInjector
इस तरह से अपने टुकड़े का उपयोग कर रहा हूं :
@Module
abstract class MainFragmentBuildersModule {
@ContributesAndroidInjector
abstract fun contributeActivityFragment(): ActivityFragment
}
और मैं इन मॉड्यूल को अपने MainActivity
उपसमुच्चय में इस तरह जोड़ रहा हूं :
@Module
abstract class ActivityBuilderModule {
...
@ContributesAndroidInjector(
modules = [MainViewModelModule::class, ActivityViewModelModule::class,
AuthModule::class, MainFragmentBuildersModule::class]
)
abstract fun contributeMainActivity(): MainActivity
}
यहाँ मेरा है AppComponent
:
@Singleton
@Component(
modules =
[AndroidSupportInjectionModule::class,
ActivityBuilderModule::class,
ViewModelFactoryModule::class,
AppModule::class]
)
interface AppComponent : AndroidInjector<SpenmoApplication> {
@Component.Builder
interface Builder {
@BindsInstance
fun application(application: Application): Builder
fun build(): AppComponent
}
}
मैं इस तरह का विस्तार DaggerFragment
और इंजेक्शन दे रहा हूं ViewModelProviderFactory
:
@Inject
lateinit var viewModelFactory: ViewModelProviderFactory
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
....
activityViewModel =
ViewModelProviders.of(this, viewModelFactory).get(key, ActivityViewModel::class.java)
activityViewModel.restartFetch(hasReceipt)
}
key
दोनों टुकड़े के लिए अलग होगा।
मैं यह कैसे सुनिश्चित कर सकता हूं कि केवल वर्तमान अंश का पर्यवेक्षक ही अपडेट हो रहा है।
EDIT 1 ->
मैंने त्रुटि के साथ एक नमूना प्रोजेक्ट जोड़ा है। ऐसा लगता है कि समस्या केवल तब हो रही है जब कोई कस्टम स्कोप जोड़ा गया है। कृपया यहाँ नमूना परियोजना की जाँच करें: Github लिंक
master
शाखा के पास इश्यू वाला ऐप है। यदि आप किसी भी टैब को रीफ़्रेश करते हैं (ताज़ा करने के लिए स्वाइप) तो दोनों टैब में अपडेटेड वैल्यू परिलक्षित हो रही है। यह केवल तब हो रहा है जब मैं इसमें एक कस्टम स्कोप जोड़ता हूं ( @MainScope
)।
working_fine
शाखा में कोई कस्टम गुंजाइश नहीं है और इसके ठीक काम करने के लिए एक ही ऐप है।
कृपया मुझे बताएं कि क्या प्रश्न स्पष्ट नहीं है।
working_fine
शाखा से दृष्टिकोण का उपयोग क्यों नहीं करेंगे ? आपको स्कोप की आवश्यकता क्यों है?