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