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)
        // ...
    }
}
ziyaret edin.