ViewModel Scoping API'leri (Görünümler)   Android Jetpack'in bir parçasıdır.

Kavramlar ve Jetpack Compose uygulaması

ViewModel'leri etkili bir şekilde kullanmak için kapsam önemlidir. Her ViewModel, ViewModelStoreOwner arayüzünü uygulayan bir nesneye göre kapsamlandırılır. ViewModel'lerinizin kapsamını daha kolay yönetmenize olanak tanıyan çeşitli API'ler vardır.

ViewModelProvider.get() yöntemi, herhangi bir ViewModelStoreOwner kapsamına alınmış bir ViewModel örneği almanızı sağlar. Kotlin kullanıcıları, en yaygın kullanım alanları için farklı uzantı işlevlerinden yararlanabilir. Tüm Kotlin uzantı işlevi uygulamaları, arka planda ViewModelProvider API'yi kullanır.

En yakın ViewModelStoreOwner'a göre kapsamlandırılmış ViewModel'ler

Bir ViewModel'i Activity, parça veya bir gezinme grafiğinin hedefiyle sınırlayabilirsiniz. Activity, Fragment ve Navigation kitaplıkları tarafından sağlanan viewModels() uzantısı işlevleri, en yakın ViewModelStoreOwner kapsamına alınmış bir ViewModel örneği almanıza olanak tanı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);
}

ViewModelStoreOwner kapsamındaki ViewModel'ler

Görünüm sistemindeki ComponentActivity.viewModels() ve Fragment.viewModels() işlevleri, ViewModel örneğinin hangi ViewModelStoreOwner kapsamına alınacağını belirtmek için kullanabileceğiniz isteğe bağlı bir ownerProducer parametresi alır. Aşağıdaki örnekte, üst parçaya kapsamı belirlenmiş bir ViewModel örneğinin nasıl alınacağı gösterilmektedir:

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);
    }
}

Bir parçadan etkinlik kapsamlı ViewModel alma, yaygın bir kullanım alanıdır. Bu işlemi yaparken activityViewModels() Görünümler uzantısı işlevini kullanabilirsiniz. Görünümler ve Kotlin kullanmıyorsanız yukarıdaki API'lerin aynısını 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);
    }
}

Gezinme grafiği kapsamındaki ViewModels

Gezinme grafikleri de ViewModel deposu sahipleridir. Navigation Fragment kullanıyorsanız navGraphViewModels(graphId) Views uzantı işleviyle bir Navigation grafiği kapsamına alınmış bir ViewModel örneği alabilirsiniz.

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);
    }
}

Jetpack Navigation'a ek olarak Hilt kullanıyorsanız hiltNavGraphViewModels(graphId) API'yi aşağıdaki gibi 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);
    }
}