পর্যবেক্ষণযোগ্য ডেটা অবজেক্টের সাথে কাজ করুন

পর্যবেক্ষণযোগ্যতা বলতে একটি বস্তুর ডেটার পরিবর্তন সম্পর্কে অন্যদের অবহিত করার ক্ষমতা বোঝায়। ডেটা বাইন্ডিং লাইব্রেরি আপনাকে বস্তু, ক্ষেত্র বা সংগ্রহগুলিকে পর্যবেক্ষণযোগ্য করতে দেয়।

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

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

পর্যবেক্ষণযোগ্য ক্ষেত্র

যদি আপনার ক্লাসে শুধুমাত্র কয়েকটি বৈশিষ্ট্য থাকে, তাহলে Observable ইন্টারফেস বাস্তবায়ন করে এমন ক্লাস তৈরি করার প্রচেষ্টার মূল্য নাও হতে পারে। এই ক্ষেত্রে, আপনি ক্ষেত্রগুলিকে পর্যবেক্ষণযোগ্য করতে জেনেরিক Observable ক্লাস এবং নিম্নলিখিত আদিম-নির্দিষ্ট ক্লাসগুলি ব্যবহার করতে পারেন:

পর্যবেক্ষণযোগ্য ক্ষেত্রগুলি হল স্বয়ংসম্পূর্ণ পর্যবেক্ষণযোগ্য বস্তু যার একটি একক ক্ষেত্র রয়েছে। আদিম সংস্করণগুলি অ্যাক্সেস অপারেশনের সময় বক্সিং এবং আনবক্সিং এড়ায়। এই পদ্ধতিটি ব্যবহার করার জন্য, জাভা প্রোগ্রামিং ভাষায় একটি public final সম্পত্তি তৈরি করুন বা কোটলিনে একটি পঠনযোগ্য সম্পত্তি তৈরি করুন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

কোটলিন

class User {
    val firstName = ObservableField<String>()
    val lastName = ObservableField<String>()
    val age = ObservableInt()
}

জাভা

private static class User {
    public final ObservableField<String> firstName = new ObservableField<>();
    public final ObservableField<String> lastName = new ObservableField<>();
    public final ObservableInt age = new ObservableInt();
}

ক্ষেত্রের মান অ্যাক্সেস করতে, set() এবং get() অ্যাক্সেসর পদ্ধতি ব্যবহার করুন বা Kotlin সম্পত্তি সিনট্যাক্স ব্যবহার করুন:

কোটলিন

user.firstName = "Google"
val age = user.age

জাভা

user.firstName.set("Google");
int age = user.age.get();

পর্যবেক্ষণযোগ্য সংগ্রহ

কিছু অ্যাপ ডাটা ধারণ করতে ডায়নামিক স্ট্রাকচার ব্যবহার করে। পর্যবেক্ষণযোগ্য সংগ্রহগুলি একটি কী ব্যবহার করে এই কাঠামোগুলিতে অ্যাক্সেসের অনুমতি দেয়। ObservableArrayMap ক্লাসটি উপযোগী যখন কী একটি রেফারেন্স টাইপ, যেমন String , নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

কোটলিন

ObservableArrayMap<String, Any>().apply {
    put("firstName", "Google")
    put("lastName", "Inc.")
    put("age", 17)
}

জাভা

ObservableArrayMap<String, Object> user = new ObservableArrayMap<>();
user.put("firstName", "Google");
user.put("lastName", "Inc.");
user.put("age", 17);

লেআউটে, আপনি স্ট্রিং কী ব্যবহার করে মানচিত্রটি খুঁজে পেতে পারেন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

<data>
    <import type="android.databinding.ObservableMap"/>
    <variable name="user" type="ObservableMap&lt;String, Object&gt;"/>
</data>
…
<TextView
    android:text="@{user.lastName}"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>
<TextView
    android:text="@{String.valueOf(1 + (Integer)user.age)}"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>

ObservableArrayList ক্লাসটি দরকারী যখন কীটি একটি পূর্ণসংখ্যা হয়, নিম্নরূপ:

কোটলিন

ObservableArrayList<Any>().apply {
    add("Google")
    add("Inc.")
    add(17)
}

জাভা

ObservableArrayList<Object> user = new ObservableArrayList<>();
user.add("Google");
user.add("Inc.");
user.add(17);

লেআউটে, আপনি সূচীগুলির মাধ্যমে তালিকাটি অ্যাক্সেস করতে পারেন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

<data>
    <import type="android.databinding.ObservableList"/>
    <import type="com.example.my.app.Fields"/>
    <variable name="user" type="ObservableList&lt;Object&gt;"/>
</data>
…
<TextView
    android:text='@{user[Fields.LAST_NAME]}'
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>
<TextView
    android:text='@{String.valueOf(1 + (Integer)user[Fields.AGE])}'
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>

পর্যবেক্ষণযোগ্য বস্তু

Observable ইন্টারফেস প্রয়োগ করে এমন একটি শ্রেণি শ্রোতাদের নিবন্ধনের অনুমতি দেয় যারা পর্যবেক্ষণযোগ্য বস্তু থেকে সম্পত্তির পরিবর্তন সম্পর্কে অবহিত হতে চায়।

Observable ইন্টারফেসে শ্রোতাদের যোগ এবং অপসারণের একটি পদ্ধতি রয়েছে, তবে আপনি সিদ্ধান্ত নেন কখন বিজ্ঞপ্তি পাঠানো হবে। উন্নয়নকে সহজ করার জন্য, ডেটা বাইন্ডিং লাইব্রেরি BaseObservable ক্লাস প্রদান করে, যা শ্রোতা নিবন্ধন পদ্ধতি প্রয়োগ করে। BaseObservable প্রয়োগকারী ডেটা ক্লাস যখন বৈশিষ্ট্য পরিবর্তন হয় তখন বিজ্ঞপ্তি দেওয়ার জন্য দায়ী। এটি করার জন্য, গেটারকে একটি Bindable টীকা বরাদ্দ করুন এবং সেটারে notifyPropertyChanged() পদ্ধতিতে কল করুন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

কোটলিন

class User : BaseObservable() {

    @get:Bindable
    var firstName: String = ""
        set(value) {
            field = value
            notifyPropertyChanged(BR.firstName)
        }

    @get:Bindable
    var lastName: String = ""
        set(value) {
            field = value
            notifyPropertyChanged(BR.lastName)
        }
}

জাভা

private static class User extends BaseObservable {
    private String firstName;
    private String lastName;

    @Bindable
    public String getFirstName() {
        return this.firstName;
    }

    @Bindable
    public String getLastName() {
        return this.lastName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
        notifyPropertyChanged(BR.firstName);
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
        notifyPropertyChanged(BR.lastName);
    }
}

ডেটা বাইন্ডিং মডিউল প্যাকেজে BR নামে একটি শ্রেণী তৈরি করে, যেখানে ডেটা বাইন্ডিংয়ের জন্য ব্যবহৃত সংস্থানগুলির আইডি রয়েছে। Bindable টীকা সংকলনের সময় BR ক্লাস ফাইলে একটি এন্ট্রি তৈরি করে। যদি ডেটা ক্লাসের জন্য বেস ক্লাস পরিবর্তন করা না যায়, তাহলে আপনি একটি PropertyChangeRegistry অবজেক্ট ব্যবহার করে শ্রোতাদের দক্ষতার সাথে নিবন্ধন ও অবহিত করতে Observable ইন্টারফেস প্রয়োগ করতে পারেন।

জীবনচক্র-সচেতন বস্তু

আপনার অ্যাপের লেআউটগুলি ডেটা বাইন্ডিং উত্সগুলির সাথেও আবদ্ধ হতে পারে যা স্বয়ংক্রিয়ভাবে UI কে ডেটার পরিবর্তন সম্পর্কে অবহিত করে৷ এইভাবে, আপনার বাইন্ডিংগুলি জীবনচক্র সম্পর্কে সচেতন এবং শুধুমাত্র তখনই ট্রিগার হয় যখন UI পর্দায় দৃশ্যমান হয়।

ডেটা বাইন্ডিং StateFlow এবং LiveData সমর্থন করে। ডেটা বাইন্ডিং-এ LiveData ব্যবহার সম্পর্কে আরও তথ্যের জন্য, ডেটা পরিবর্তন সম্পর্কে UI-কে অবহিত করতে LiveData ব্যবহার করুন দেখুন।

স্টেটফ্লো ব্যবহার করুন

যদি আপনার অ্যাপ কোরটিনের সাথে কোটলিন ব্যবহার করে, তাহলে আপনি StateFlow অবজেক্টগুলিকে ডেটা বাইন্ডিং সোর্স হিসেবে ব্যবহার করতে পারেন। আপনার বাইন্ডিং ক্লাসের সাথে একটি StateFlow অবজেক্ট ব্যবহার করতে, StateFlow অবজেক্টের সুযোগ নির্ধারণ করতে একটি লাইফসাইকেল মালিক নির্দিষ্ট করুন। নিম্নলিখিত উদাহরণটি বাইন্ডিং ক্লাস ইনস্ট্যান্ট হওয়ার পরে জীবনচক্রের মালিক হিসাবে কার্যকলাপটি নির্দিষ্ট করে:

class ViewModelActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        // Inflate view and obtain an instance of the binding class.
        val binding: UserBinding = DataBindingUtil.setContentView(this, R.layout.user)

        // Specify the current activity as the lifecycle owner.
        binding.lifecycleOwner = this
    }
}

আর্কিটেকচার কম্পোনেন্টে লেআউট ভিউ বাইন্ডে বর্ণিত হিসাবে, ডেটা বাইন্ডিং ViewModel অবজেক্টের সাথে নির্বিঘ্নে কাজ করে। আপনি নিম্নলিখিত হিসাবে StateFlow এবং ViewModel একসাথে ব্যবহার করতে পারেন:

class ScheduleViewModel : ViewModel() {

    private val _username = MutableStateFlow<String>("")
    val username: StateFlow<String> = _username

    init {
        viewModelScope.launch {
            _username.value = Repository.loadUserName()
        }
    }
}

আপনার লেআউটে, আপনার ViewModel অবজেক্টের বৈশিষ্ট্য এবং পদ্ধতিগুলিকে বাইন্ডিং এক্সপ্রেশন ব্যবহার করে সংশ্লিষ্ট দৃশ্যগুলিতে বরাদ্দ করুন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

<TextView
    android:id="@+id/name"
    android:text="@{viewmodel.username}" />

যখনই ব্যবহারকারীর নামের মান পরিবর্তন হয় তখনই UI স্বয়ংক্রিয়ভাবে আপডেট হয়।

স্টেটফ্লো সমর্থন অক্ষম করুন

কোটলিন এবং অ্যান্ড্রয়েডএক্স ব্যবহার করে এমন অ্যাপ্লিকেশানগুলির জন্য, StateFlow সমর্থন স্বয়ংক্রিয়ভাবে ডেটা বাইন্ডিংয়ের সাথে অন্তর্ভুক্ত হয়৷ এর মানে হল যে নির্ভরতা ইতিমধ্যে উপলব্ধ না থাকলে কর্উটিন নির্ভরতা স্বয়ংক্রিয়ভাবে আপনার অ্যাপে অন্তর্ভুক্ত করা হয়।

আপনি আপনার build.gradle ফাইলে নিম্নলিখিত যোগ করে এই কার্যকারিতা থেকে অপ্ট আউট করতে পারেন:

গ্রোভি

android {
    ...
    dataBinding {
        addKtx = false
    }
}

কোটলিন

android {
    ...
    dataBinding {
        addKtx = false
    }
}

বিকল্পভাবে, আপনি gradle.properties ফাইলে নিম্নলিখিত লাইন যোগ করে আপনার প্রকল্পে বিশ্বব্যাপী StateFlow অক্ষম করতে পারেন:

গ্রোভি

android.defaults.databinding.addKtx = false

কোটলিন

android.defaults.databinding.addKtx = false

অতিরিক্ত সম্পদ

ডেটা বাইন্ডিং সম্পর্কে আরও জানতে, অতিরিক্ত সংস্থানগুলির জন্য নিম্নলিখিতগুলি দেখুন:

নমুনা

কোডল্যাব

ব্লগ এর লেখাগুলো

{% শব্দার্থে %} {% endverbatim %}