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);
    }
}
{% کلمه به کلمه %} {% فعل کمکی %} {% کلمه به کلمه %} {% فعل کمکی %}