ViewModel Scoping APIs بخشی از Android Jetpack .
Scope کلید استفاده موثر از ViewModels است. هر ViewModel به یک شی اختصاص داده می شود که رابط ViewModelStoreOwner
را پیاده سازی می کند. چندین API وجود دارد که به شما امکان می دهد تا دامنه ViewModels خود را به راحتی مدیریت کنید. این سند برخی از تکنیک های کلیدی را که باید بدانید را تشریح می کند.
متد ViewModelProvider.get()
به شما امکان میدهد نمونهای از ViewModel را در محدوده هر ViewModelStoreOwner
به دست آورید. برای کاربران Kotlin، توابع برنامه افزودنی مختلفی برای رایج ترین موارد استفاده وجود دارد. همه پیادهسازیهای تابع افزونه Kotlin از ViewModelProvider API در زیر هود استفاده میکنند.
ViewModels با نزدیکترین ViewModelStoreOwner
می توانید یک ViewModel را به یک فعالیت، بخش یا مقصد یک نمودار ناوبری محدود کنید. توابع افزونه viewModels()
ارائه شده توسط کتابخانههای Activity، Fragment و Navigation، و تابع viewModel()
در Compose به شما امکان میدهد نمونهای از ViewModel را با محدوده نزدیکترین ViewModelStoreOwner
دریافت کنید.
بازدیدها
import androidx.activity.viewModels class MyActivity : AppCompatActivity() { // ViewModel API available in activity.activity-ktx // The ViewModel is scoped to `this` Activity val viewModel: MyViewModel by viewModels() } import androidx.fragment.app.viewModels class MyFragment : Fragment() { // ViewModel API available in fragment.fragment-ktx // The ViewModel is scoped to `this` Fragment val viewModel: MyViewModel by viewModels() }
بازدیدها
import androidx.lifecycle.ViewModelProvider; public class MyActivity extends AppCompatActivity { // The ViewModel is scoped to `this` Activity MyViewModel viewModel = new ViewModelProvider(this).get(MyViewModel.class); } public class MyFragment extends Fragment { // The ViewModel is scoped to `this` Fragment MyViewModel viewModel = new ViewModelProvider(this).get(MyViewModel.class); }
نوشتن
import androidx.lifecycle.viewmodel.compose.viewModel @Composable fun MyScreen( modifier: Modifier = Modifier, // ViewModel API available in lifecycle.lifecycle-viewmodel-compose // The ViewModel is scoped to the closest ViewModelStoreOwner provided // via the LocalViewModelStoreOwner CompositionLocal. In order of proximity, // this could be the destination of a Navigation graph, the host Fragment, // or the host Activity. viewModel: MyViewModel = viewModel() ) { /* ... */ }
ViewModels به هر ViewModelStoreOwner محدود شده است
توابع ComponentActivity.viewModels()
و Fragment.viewModels()
در سیستم View و تابع viewModel()
در Compose یک پارامتر ownerProducer
اختیاریProducer را می گیرند که می توانید از آن برای تعیین اینکه نمونه ViewModel به کدام ViewModelStoreOwner
اختصاص دارد استفاده کنید. نمونه زیر نشان میدهد که چگونه میتوان نمونهای از ViewModel را در محدوده قطعه والد دریافت کرد:
بازدیدها
import androidx.fragment.app.viewModels class MyFragment : Fragment() { // ViewModel API available in fragment.fragment-ktx // The ViewModel is scoped to the parent of `this` Fragment val viewModel: SharedViewModel by viewModels( ownerProducer = { requireParentFragment() } ) }
بازدیدها
import androidx.lifecycle.ViewModelProvider; public class MyFragment extends Fragment { SharedViewModel viewModel; @Override public void onViewCreated(View view, Bundle savedInstanceState) { // The ViewModel is scoped to the parent of `this` Fragment viewModel = new ViewModelProvider(requireParentFragment()) .get(SharedViewModel.class); } }
نوشتن
import androidx.lifecycle.viewmodel.compose.viewModel @Composable fun MyScreen( context: Context = LocalContext.current, // ViewModel API available in lifecycle.lifecycle-viewmodel-compose // The ViewModel is scoped to the parent of the host Fragment // where this composable function is called viewModel: SharedViewModel = viewModel( viewModelStoreOwner = (context as Fragment).requireParentFragment() ) ) { /* ... */ }
گرفتن یک ViewModel با محدوده فعالیت از یک Fragment یک مورد استفاده رایج است. هنگام انجام این کار، از تابع افزودنی activityViewModels()
استفاده کنید. اگر از Views و Kotlin استفاده نمیکنید، میتوانید از همان APIهای بالا و با عبور از مالک مناسب استفاده کنید.
بازدیدها
import androidx.fragment.app.activityViewModels class MyFragment : Fragment() { // ViewModel API available in fragment.fragment-ktx // The ViewModel is scoped to the host Activity val viewModel: SharedViewModel by activityViewModels() }
بازدیدها
import androidx.lifecycle.ViewModelProvider; public class MyFragment extends Fragment { SharedViewModel viewModel; @Override public void onViewCreated(View view, Bundle savedInstanceState) { // The ViewModel is scoped to the host Activity viewModel = new ViewModelProvider(requireActivity()) .get(SharedViewModel.class); } }
نوشتن
import androidx.lifecycle.viewmodel.compose.viewModel @Composable fun MyScreen( context: Context = LocalContext.current, // ViewModel API available in lifecycle.lifecycle-viewmodel-compose // The ViewModel is scoped to the Activity of the host Fragment // where this composable function is called viewModel: SharedViewModel = viewModel( viewModelStoreOwner = (context as Fragment).requireActivity() ) ) { /* ... */ }
ViewModels با محدوده نمودار ناوبری
نمودارهای ناوبری نیز مالک فروشگاه ViewModel هستند. اگر از Navigation Fragment یا Navigation Compose استفاده میکنید، میتوانید با تابع پسوند navGraphViewModels(graphId)
Views نمونهای از ViewModel را در یک نمودار ناوبری دریافت کنید.
بازدیدها
import androidx.navigation.navGraphViewModels class MyFragment : Fragment() { // ViewModel API available in navigation.navigation-fragment // The ViewModel is scoped to the `nav_graph` Navigation graph val viewModel: SharedViewModel by navGraphViewModels(R.id.nav_graph) // Equivalent navGraphViewModels code using the viewModels API val viewModel: SharedViewModel by viewModels( { findNavController().getBackStackEntry(R.id.nav_graph) } ) }
بازدیدها
import androidx.lifecycle.ViewModelProvider; public class MyFragment extends Fragment { SharedViewModel viewModel; @Override public void onViewCreated(View view, Bundle savedInstanceState) { NavController navController = NavHostFragment.findNavController(this); NavBackStackEntry backStackEntry = navController.getBackStackEntry(R.id.my_graph); // The ViewModel is scoped to the `nav_graph` Navigation graph viewModel = new ViewModelProvider(backStackEntry).get(SharedViewModel.class); } }
نوشتن
import androidx.lifecycle.viewmodel.compose.viewModel @Composable fun MyAppNavHost() { // ... composable("myScreen") { backStackEntry -> // Retrieve the NavBackStackEntry of "parentNavigationRoute" val parentEntry = remember(backStackEntry) { navController.getBackStackEntry("parentNavigationRoute") } // Get the ViewModel scoped to the `parentNavigationRoute` Nav graph val parentViewModel: SharedViewModel = viewModel(parentEntry) // ... } }
اگر علاوه بر Jetpack Navigation از Hilt استفاده می کنید، می توانید از API hiltNavGraphViewModels(graphId)
به صورت زیر استفاده کنید.
بازدیدها
import androidx.hilt.navigation.fragment.hiltNavGraphViewModels class MyFragment : Fragment() { // ViewModel API available in hilt.hilt-navigation-fragment // The ViewModel is scoped to the `nav_graph` Navigation graph // and is provided using the Hilt-generated ViewModel factory val viewModel: SharedViewModel by hiltNavGraphViewModels(R.id.nav_graph) }
بازدیدها
import androidx.hilt.navigation.HiltViewModelFactory; import androidx.lifecycle.ViewModelProvider; public class MyFragment extends Fragment { SharedViewModel viewModel; @Override public void onViewCreated(View view, Bundle savedInstanceState) { NavController navController = NavHostFragment.findNavController(this); NavBackStackEntry backStackEntry = navController.getBackStackEntry(R.id.my_graph); // The ViewModel is scoped to the `nav_graph` Navigation graph // and is provided using the Hilt-generated ViewModel factory viewModel = new ViewModelProvider( backStackEntry, HiltViewModelFactory.create(getContext(), backStackEntry) ).get(SharedViewModel.class); } }
نوشتن
import androidx.hilt.navigation.compose.hiltViewModel @Composable fun MyAppNavHost() { // ... composable("myScreen") { backStackEntry -> val parentEntry = remember(backStackEntry) { navController.getBackStackEntry("parentNavigationRoute") } // ViewModel API available in hilt.hilt-navigation-compose // The ViewModel is scoped to the `parentNavigationRoute` Navigation graph // and is provided using the Hilt-generated ViewModel factory val parentViewModel: SharedViewModel = hiltViewModel(parentEntry) // ... } }
برای شما توصیه می شود
- توجه: وقتی جاوا اسکریپت خاموش است، متن پیوند نمایش داده می شود
- چیدمان ها و عبارات الزام آور
- نمای کلی ViewModel