ViewModel Scoping API (Views)   Android Jetpack-এর অংশ।

ধারণা ও Jetpack Compose-এর প্রয়োগ

ViewModel কার্যকরভাবে ব্যবহার করার জন্য স্কোপ হল মূল চাবিকাঠি। প্রতিটি ViewModel এমন একটি অবজেক্টের জন্য স্কোপ করা হয় যা ViewModelStoreOwner ইন্টারফেস প্রয়োগ করে। এমন অনেক API আছে যা আপনাকে আরও সহজে আপনার ViewModel-এর স্কোপ ম্যানেজ করতে দেয়।

ViewModelProvider.get() পদ্ধতি আপনাকে যেকোনও ViewModelStoreOwner-এ স্কোপ করা ViewModel-এর ইনস্ট্যান্স পেতে দেয়। Kotlin ব্যবহারকারীদের জন্য, সবচেয়ে সাধারণ ব্যবহারের ক্ষেত্রে বিভিন্ন এক্সটেনশন ফাংশন উপলভ্য। সব Kotlin এক্সটেনশন ফাংশন ইমপ্লিমেন্টেশন ViewModelProvider API ব্যবহার করে।

সবচেয়ে কাছের ViewModelStoreOwner-এ ViewModel স্কোপ করা

আপনি কোনও অ্যাক্টিভিটি, ফ্র্যাগমেন্ট বা নেভিগেশন গ্রাফের গন্তব্যে ViewModel-এর স্কোপ নির্ধারণ করতে পারবেন। অ্যাক্টিভিটি, ফ্র্যাগমেন্ট ও নেভিগেশন লাইব্রেরির মাধ্যমে প্রদান করা viewModels() এক্সটেনশন ফাংশন আপনাকে সবচেয়ে কাছের ViewModelStoreOwner-এ স্কোপ করা ViewModel-এর ইনস্ট্যান্স পেতে দেয়।

ভিউ

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

যেকোনও ViewModelStoreOwner-এর জন্য ViewModel স্কোপ করা হয়েছে

ভিউ সিস্টেমের ComponentActivity.viewModels() এবং Fragment.viewModels() ফাংশন একটি ঐচ্ছিক ownerProducer প্যারামিটার নেয় যা আপনি ViewModel-এর ইনস্ট্যান্স কোন ViewModelStoreOwner-এ স্কোপ করা আছে তা নির্দিষ্ট করতে ব্যবহার করতে পারেন। নিম্নলিখিত স্যাম্পেল থেকে জানা যায় যে কীভাবে পেরেন্ট ফ্র্যাগমেন্টে স্কোপ করা 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);
    }
}

Fragment থেকে অ্যাক্টিভিটি-স্কোপড ViewModel পাওয়া একটি সাধারণ ব্যবহারের উদাহরণ। এটি করার সময়, আপনি 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 ব্যবহার করলে, navGraphViewModels(graphId) Views এক্সটেনশন ফাংশন সহ Navigation গ্রাফে স্কোপ করা 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 ব্যবহার করলে, আপনি নিম্নলিখিত উপায়ে 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);
    }
}