واجهات برمجة التطبيقات لتحديد نطاق ViewModel (طريقة العرض)   جزء من Android Jetpack.

المفاهيم وتنفيذ Jetpack Compose

يُعد تحديد النطاق أمرًا أساسيًا لاستخدام نماذج العرض (ViewModels) بفعالية. يتم تحديد نطاق كل نموذج عرض (ViewModel) لكائن يطبّق واجهة ViewModelStoreOwner. تتوفّر عدة واجهات برمجة تطبيقات تتيح لك إدارة نطاق نماذج العرض (ViewModels) بسهولة أكبر.

تتيح لك طريقة ViewModelProvider.get() الحصول على مثيل من ViewModel محدّد النطاق لأي ViewModelStoreOwner. بالنسبة إلى مستخدمي Kotlin، تتوفّر دوال إضافية مختلفة لحالات الاستخدام الأكثر شيوعًا. تستخدم جميع عمليات تنفيذ الدوال الإضافية في Kotlin واجهة برمجة التطبيقات ViewModelProvider تحت الغطاء.

نماذج العرض (ViewModels) المحدّدة النطاق لأقرب ViewModelStoreOwner

يمكنك تحديد نطاق ViewModel لنشاط أو جزء أو وجهة في رسم بياني للتنقّل. تتيح لك الدوال الإضافية viewModels() التي توفّرها مكتبات الأنشطة والأجزاء والتنقّل الحصول على مثيل من 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() في نظام العرض مَعلمة اختيارية 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 محدّد النطاق لنشاط من جزء حالة استخدام شائعة. عند إجراء ذلك، يمكنك استخدام الدالة الإضافية activityViewModels() في طريقة العرض. إذا كنت لا تستخدم طريقة العرض و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) المحدّدة النطاق لرسم بياني للتنقّل

تُعدّ الرسومات البيانية للتنقّل أيضًا مالكة لمخزن ViewModel. إذا كنت تستخدم Navigation Fragment، يمكنك الحصول على مثيل من ViewModel محدّد النطاق لرسم بياني للتنقّل باستخدام navGraphViewModels(graphId) الدالة الإضافية في طريقة العرض.

طريقة العرض

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

إذا كنت تستخدم Hilt بالإضافة إلى Jetpack Navigation، يمكنك استخدام الـ 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);
    }
}