ViewModel Kapsam Oluşturma API'leri Android Jetpack'in bir parçasıdır.
Kapsam, ViewModelleri etkili bir şekilde kullanmanın anahtarıdır. Her ViewModel,
ViewModelStoreOwner
arayüzünü uygulayan nesnedir. Her biri 100'den az gösterim alan
ViewModellerinizin kapsamını daha kolay yönetmenizi sağlayan çeşitli API'ler.
Bu belgede, bilmeniz gereken bazı temel teknikler özetlenmektedir.
ViewModelProvider.get()
yöntemi, bir ViewModel'in bir örneğini almanızı sağlar
herhangi bir ViewModelStoreOwner
olarak ayarlanır. Kotlin kullanıcıları için farklı yaklaşımlar
uzantı işlevlerini kullanabilirsiniz. Tüm Kotlin
uzantı işlevi uygulamaları, arka planda ViewModelProvider API'yi kullanır.
En yakın ViewModelStoreOwner kapsamına alınan ViewModeller
Bir ViewModel'i bir Etkinlik, Parça veya hedefin
Gezinme grafiği. İlgili içeriği oluşturmak için kullanılan
viewModels()
uzantısı
kitaplıklar tarafından sağlanan Etkinlik, Parça ve Gezinme kitaplıkları ve
Compose'daki viewModel()
işlevi, ViewModel'in bir örneğini almanızı sağlar
en yakın ViewModelStoreOwner
değerine ayarlanır.
Görüntüleme sayısı
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() }
Görüntüleme sayısı
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); }
Oluştur
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() ) { /* ... */ }
Herhangi bir ViewModelStoreOwner kapsamındaki ViewModeller
ComponentActivity.viewModels()
ve Fragment.viewModels()
işlevleri
Oluştur'daki sistemi görüntüle ve viewModel()
işlevi,
Hangi ownerProducer
parametresine uygulanacağını belirtmek için
ViewModelStoreOwner
.
Aşağıdaki örnekte
üst parça:
Görüntüleme sayısı
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() } ) }
Görüntüleme sayısı
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); } }
Oluştur
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() ) ) { /* ... */ }
Bir Parçadan Etkinlik Kapsamlı ViewModel almak yaygın bir kullanım alanıdır. Zaman
Bunun için activityViewModels()
Görüntüleme uzantısı işlevi kullanılabilir. Görünümler ve Kotlin'i kullanmıyorsanız
yukarıdakiyle aynı API'leri ve doğru sahibi ileterek kullanabilirsiniz.
Görüntüleme sayısı
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() }
Görüntüleme sayısı
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); } }
Oluştur
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() ) ) { /* ... */ }
Gezinme grafiğinin kapsamında olan ViewModeller
Gezinme grafikleri aynı zamanda ViewModel mağaza sahipleridir. Şunu kullanıyorsanız:
Gezinme Bölümü veya
Gezinme Oluşturma'yı seçtiğinizde bir
ViewModel kapsamında,
navGraphViewModels(graphId)
Uzantı işlevini görüntüler.
Görüntüleme sayısı
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) } ) }
Görüntüleme sayısı
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); } }
Oluştur
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 Navigasyon'a ek olarak Hilt kullanıyorsanız
hiltNavGraphViewModels(graphId)
aşağıdaki gibi API'yi kullanabilirsiniz.
Görüntüleme sayısı
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) }
Görüntüleme sayısı
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); } }
Oluştur
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) // ... } }
Sizin için önerilenler
- Not: JavaScript kapalıyken bağlantı metni gösterilir
- Düzenler ve bağlama ifadeleri
- ViewModel'e genel bakış