APIهای محدودهبندی ViewModel (Views) بخشی از Android Jetpack .
مفاهیم و پیادهسازی Jetpack Compose
محدوده (scope) کلید استفاده موثر از ViewModelها است. هر ViewModel به یک شیء که رابط ViewModelStoreOwner را پیادهسازی میکند، محدود میشود. چندین API وجود دارد که به شما امکان میدهد محدوده ViewModelهای خود را راحتتر مدیریت کنید.
متد ViewModelProvider.get() به شما امکان میدهد نمونهای از ViewModel را که به هر ViewModelStoreOwner محدود شده است، دریافت کنید. برای کاربران Kotlin، توابع الحاقی مختلفی برای رایجترین موارد استفاده در دسترس است. همه پیادهسازیهای توابع الحاقی Kotlin از API ViewModelProvider در زیر کاپوت استفاده میکنند.
ViewModelها به نزدیکترین ViewModelStoreOwner محدود میشوند
شما میتوانید یک ViewModel را به یک Activity، Fragment یا مقصد یک Navigation graph محدود کنید. توابع الحاقی 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); }
ViewModelها به هر 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 استفاده نمیکنید، میتوانید از همان 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); } }
ViewModelها به گراف ناوبری محدود میشوند
گرافهای ناوبری همچنین مالکین فروشگاه ViewModel هستند. اگر از Navigation Fragment استفاده میکنید، میتوانید با استفاده از تابع افزونه Views به نام navGraphViewModels(graphId) نمونهای از 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); } }
اگر علاوه بر 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); } }
برای شما توصیه میشود
- توجه: متن لینک زمانی نمایش داده میشود که جاوا اسکریپت غیرفعال باشد.
- طرحبندیها و عبارات اتصال
- نمای کلی ViewModel
محتوا و نمونه کدها در این صفحه مشمول پروانههای توصیفشده در پروانه محتوا هستند. جاوا و OpenJDK علامتهای تجاری یا علامتهای تجاری ثبتشده Oracle و/یا وابستههای آن هستند.
تاریخ آخرین بهروزرسانی 2026-04-30 بهوقت ساعت هماهنگ جهانی.