ভিউমডেলের সংক্ষিপ্ত বিবরণ (ভিউ)

ধারণা এবং জেটপ্যাক কম্পোজ বাস্তবায়ন

ViewModel ক্লাসটি হলো একটি বিজনেস লজিক বা স্ক্রিন লেভেল স্টেট হোল্ডার । এটি UI-এর কাছে স্টেট প্রকাশ করে এবং সম্পর্কিত বিজনেস লজিককে এনক্যাপসুলেট করে। এর প্রধান সুবিধা হলো এটি স্টেট ক্যাশ করে রাখে এবং কনফিগারেশন পরিবর্তনের পরেও তা বজায় রাখে। এর মানে হলো, অ্যাক্টিভিটিগুলোর মধ্যে নেভিগেট করার সময়, বা স্ক্রিন ঘোরানোর মতো কনফিগারেশন পরিবর্তনের পরে আপনার UI-কে আবার ডেটা ফেচ করতে হয় না।

ভিউমডেল সুবিধাগুলি

ViewModel-এর বিকল্প হলো একটি সাধারণ ক্লাস, যা আপনার UI-তে প্রদর্শিত ডেটা ধারণ করে। অ্যাক্টিভিটি বা নেভিগেশন গন্তব্যের মধ্যে নেভিগেট করার সময় এটি একটি সমস্যা হয়ে দাঁড়াতে পারে। আপনি যদি সেভড ইনস্ট্যান্স স্টেট মেকানিজম ব্যবহার করে ডেটা সংরক্ষণ না করেন, তবে এমনটা করলে সেই ডেটা নষ্ট হয়ে যায়। ViewModel ডেটা পার্সিস্টেন্সের জন্য একটি সুবিধাজনক API প্রদান করে যা এই সমস্যার সমাধান করে।

ViewModel ক্লাসের মূল সুবিধা মূলত দুটি:

  • এটি আপনাকে UI স্টেট সংরক্ষণ করতে দেয়।
  • এটি ব্যবসায়িক যুক্তিতে প্রবেশাধিকার প্রদান করে।

পরিধি

যখন আপনি একটি ViewModel ইনস্ট্যানশিয়েট করেন, তখন আপনি এটিকে এমন একটি অবজেক্ট পাস করেন যা ViewModelStoreOwner ইন্টারফেসটি ইমপ্লিমেন্ট করে। এটি একটি নেভিগেশন ডেস্টিনেশন, নেভিগেশন গ্রাফ, অ্যাক্টিভিটি, ফ্র্যাগমেন্ট, বা ইন্টারফেসটি ইমপ্লিমেন্ট করে এমন অন্য যেকোনো টাইপ হতে পারে। এরপর আপনার ViewModel-টি ViewModelStoreOwner এর Lifecycle মধ্যে সীমাবদ্ধ থাকে। এটি মেমরিতে ততক্ষণ পর্যন্ত থাকে যতক্ষণ না এর ViewModelStoreOwner স্থায়ীভাবে বিলুপ্ত হয়ে যায়।

বিভিন্ন ক্লাস ViewModelStoreOwner ইন্টারফেসের প্রত্যক্ষ বা পরোক্ষ সাবক্লাস। প্রত্যক্ষ সাবক্লাসগুলো হলো ComponentActivity , Fragment এবং NavBackStackEntry । পরোক্ষ সাবক্লাসগুলোর সম্পূর্ণ তালিকার জন্য ViewModelStoreOwner রেফারেন্স দেখুন।

একটি ভিউমডেল বাস্তবায়ন করুন

নিম্নলিখিতটি এমন একটি স্ক্রিনের জন্য ViewModel-এর একটি উদাহরণ বাস্তবায়ন, যা ব্যবহারকারীকে পাশা নিক্ষেপ করার সুযোগ দেয়।

কোটলিন

data class DiceUiState(
    val firstDieValue: Int? = null,
    val secondDieValue: Int? = null,
    val numberOfRolls: Int = 0,
)

class DiceRollViewModel : ViewModel() {

    // Expose screen UI state
    private val _uiState = MutableStateFlow(DiceUiState())
    val uiState: StateFlow<DiceUiState> = _uiState.asStateFlow()

    // Handle business logic
    fun rollDice() {
        _uiState.update { currentState ->
            currentState.copy(
                firstDieValue = Random.nextInt(from = 1, until = 7),
                secondDieValue = Random.nextInt(from = 1, until = 7),
                numberOfRolls = currentState.numberOfRolls + 1,
            )
        }
    }
}

জাভা

public class DiceUiState {
    private final Integer firstDieValue;
    private final Integer secondDieValue;
    private final int numberOfRolls;

    // ...
}

public class DiceRollViewModel extends ViewModel {

    private final MutableLiveData<DiceUiState> uiState =
        new MutableLiveData(new DiceUiState(null, null, 0));
    public LiveData<DiceUiState> getUiState() {
        return uiState;
    }

    public void rollDice() {
        Random random = new Random();
        uiState.setValue(
            new DiceUiState(
                random.nextInt(7) + 1,
                random.nextInt(7) + 1,
                uiState.getValue().getNumberOfRolls() + 1
            )
        );
    }
}

এরপর আপনি একটি অ্যাক্টিভিটি থেকে নিম্নলিখিতভাবে ViewModel অ্যাক্সেস করতে পারবেন:

কোটলিন

import androidx.activity.viewModels

class DiceRollActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        // Create a ViewModel the first time the system calls an activity's onCreate() method.
        // Re-created activities receive the same DiceRollViewModel instance created by the first activity.

        // Use the 'by viewModels()' Kotlin property delegate
        // from the activity-ktx artifact
        val viewModel: DiceRollViewModel by viewModels()
        lifecycleScope.launch {
            repeatOnLifecycle(Lifecycle.State.STARTED) {
                viewModel.uiState.collect {
                    // Update UI elements
                }
            }
        }
    }
}

জাভা

public class MyActivity extends AppCompatActivity {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Create a ViewModel the first time the system calls an activity's onCreate() method.
        // Re-created activities receive the same MyViewModel instance created by the first activity.
        DiceRollViewModel model = new ViewModelProvider(this).get(DiceRollViewModel.class);
        model.getUiState().observe(this, uiState -> {
            // update UI
        });
    }
}
{% হুবহু %} {% endverbatim %} {% হুবহু %} {% endverbatim %}