আমি আমার প্রকল্পে ডগার 2 যুক্ত করার চেষ্টা করছি। আমি আমার খণ্ডগুলির জন্য ভিউমোডেলগুলি (অ্যান্ড্রয়েডএক্স আর্কিটেকচার উপাদান) ইনজেক্ট করতে সক্ষম হয়েছি।
আমার কাছে একটি ভিউপিজার রয়েছে যার একই টুকরোটির 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
উভয় টুকরা ভাষার জন্য আলাদা হতে হবে।
আমি কীভাবে নিশ্চিত করতে পারি যে কেবলমাত্র বর্তমান খণ্ডের পর্যবেক্ষক আপডেট হচ্ছে।
সম্পাদনা 1 ->
আমি ত্রুটি সহ একটি নমুনা প্রকল্প যুক্ত করেছি। দেখে মনে হচ্ছে সমস্যাটি কেবল তখনই ঘটে যখন একটি কাস্টম স্কোপ যুক্ত করা হয়। দয়া করে এখানে নমুনা প্রকল্পটি দেখুন: গিথুব লিঙ্ক
master
শাখাটি ইস্যু সহ অ্যাপ্লিকেশন আছে। আপনি যদি কোনও ট্যাব রিফ্রেশ করেন (রিফ্রেশ করতে সোয়াইপ করুন) তবে আপডেট হওয়া মানটি দুটি ট্যাবেই প্রতিবিম্বিত হচ্ছে। এটি কেবল তখনই ঘটে যখন আমি এটিতে একটি কাস্টম সুযোগ যুক্ত করি ( @MainScope
)।
working_fine
শাখায় একই অ্যাপ্লিকেশন রয়েছে যার কোনও কাস্টম সুযোগ নেই এবং এটির কাজ ঠিক আছে।
প্রশ্নটি পরিষ্কার না হলে দয়া করে আমাকে জানান।
working_fine
শাখা থেকে পদ্ধতির ব্যবহার করবেন না ? আপনার সুযোগ কেন দরকার?