ViewModel Scoping APIs (Views) بخشی از Android Jetpack.
مفاهیم و پیادهسازی Jetpack Compose
محدوده کلید استفاده مؤثر از ViewModels است. هر ViewModel به شیئی محدود میشود که میانای ViewModelStoreOwner را پیادهسازی میکند. چندین میانای برنامهسازی کاربردی وجود دارد که به شما امکان میدهد دامنه ViewModels خود را راحتتر مدیریت کنید.
روش ViewModelProvider.get() به شما امکان میدهد نمونهای از ViewModel را که به هر ViewModelStoreOwner محدود شده است دریافت کنید. برای کاربران Kotlin، توابع افزونه متفاوتی برای رایجترین موارد استفاده دردسترس است. همه پیادهسازیهای تابع افزونه Kotlin از ViewModelProvider API در پشت صحنه استفاده میکنند.
ViewModels با دامنه نزدیکترین ViewModelStoreOwner
میتوانید ViewModel را به Activity، Fragment، یا مقصد
نمودار پیمایش محدود کنید. توابع افزونه
viewModels()
ارائهشده توسط کتابخانههای Activity، Fragment، و Navigation
به شما امکان میدهند نمونهای از 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); }
ViewModels با دامنه ViewModelStoreOwner
توابع ComponentActivity.viewModels() و Fragment.viewModels() در
سیستم View پارامتر اختیاری
ownerProducer را میگیرند که میتوانید از آن برای مشخص کردن
ViewModelStoreOwner که نمونه ViewModel به آن محدود شده است استفاده کنید.
نمونه زیر نشان میدهد که چگونه میتوان نمونهای از 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); } }
دریافت ViewModel با دامنه فعالیت از Fragment یک مورد استفاده رایج است. هنگام
انجام این کار، میتوانید از تابع افزونه activityViewModels()
Views استفاده کنید. اگر از Views و Kotlin استفاده نمیکنید،
میتوانید از همان میاناهای برنامهسازی کاربردی بالا استفاده کنید و مالک درست را ارسال کنید.
بازدیدها
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); } }
ViewModels scoped to the Navigation graph
نمودارهای پیمایش همچنین مالکان فروشگاه ViewModel هستند. اگر از
Navigation Fragment استفاده میکنید، میتوانید بااستفاده از تابع افزونه
navGraphViewModels(graphId)
Views، نمونهای از
ViewModel را که به نمودار Navigation محدود شده است دریافت کنید.
بازدیدها
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); } }
اگر علاوهبر Jetpack Navigation از Hilt استفاده میکنید، میتوانید از
hiltNavGraphViewModels(graphId)
API بهصورت زیر استفاده کنید.
بازدیدها
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); } }
توصیهشده برای شما
- توجه: وقتی جاوا اسکریپت خاموش باشد، نوشتار پیوند نمایش داده میشود
- چیدمانها و عبارتهای اتصال
- نمای کلی ViewModel