Glance-এর মাধ্যমে সমস্যার সমাধান করা

Android 15 থেকে শুরু করে Glance-এ সমস্যা সমাধান উন্নত করার জন্য API ফিচার অন্তর্ভুক্ত করা হয়েছে। এইসব API সংক্রান্ত পেশাদার পদ্ধতি এই পৃষ্ঠায় দেওয়া আছে।

কম্পোজ করা যায় না এমন কম্পোনেন্টের চারপাশে try-catch ব্লক ব্যবহার করুন

Compose, কম্পোজেবল আইটেমের চারপাশে try-catch ব্লক ব্যবহার করার অনুমতি দেয় না, তবে আপনাকে এইসব ব্লকে আপনার অ্যাপের অন্যান্য লজিক র‍্যাপ করতে দেয়। এটি আপনাকে নিম্নলিখিত উদাহরণে দেখানো আপনার এরর ভিউয়ের জন্য কম্পোজ ব্যবহার করতে দেয়:

provideContent {
    var isError = false
    var data = listOf<String>()
    try {
        val repository = (context.applicationContext as MyApplication).myRepository
        data = repository.loadData()
    } catch (e: Exception) {
        isError = true
        // TODO: handle error
    }

    if (isError) {
        ErrorView()
    } else {
        Content(data)
    }
}

ডিফল্ট সমস্যার লেআউট

কোনও আনকড ব্যতিক্রম বা কম্পোজ সংক্রান্ত সমস্যা থাকলে, Glance একটি ডিফল্ট সমস্যা লেআউট দেখায়:

সমস্যার ধরন উল্লেখ করা একটি সমস্যার মেসেজ এবং সেটি কোথায়
  খুঁজতে হবে সেই সংক্রান্ত সাজেশন
ছবি ১. Glance 1.0 ডিফল্ট সমস্যার লেআউট
'কন্টেন্ট দেখানো যাচ্ছে না' লেখা একটি বক্স
ছবি ২. Glance 1.1.0 ডিফল্ট সমস্যার লেআউট

কম্পোজিশন কাজ না করলে, ফলব্যাক হিসেবে Glance ডেভেলপারদের XML লেআউট প্রদান করতে দেয়। এর অর্থ হল, কম্পোজ কোডে কোনও সমস্যা হয়েছে। আপনার অ্যাপের কোডে কোনও আনকড এরর থাকলেও এই UI সমস্যাটি দেখা যায়।

class UpgradeWidget : GlanceAppWidget(errorUiLayout = R.layout.error_layout) {
    // ...
}
এই লেআউট হল একটি স্ট্যাটিক লেআউট যার সাথে আপনার ব্যবহারকারী ইন্ট্যার‍্যাক্ট করতে পারবেন না, তবে এটি জরুরি অবস্থার ক্ষেত্রে ভালো।

এতে একটি শিরোনাম ও ত্রুটি মেসেজ দেখানোর জন্য টেক্সট ফিল্ড থাকে
ছবি ৩. কাস্টম সমস্যার লেআউটের উদাহরণ

ডিফল্ট সমস্যার UI-তে অ্যাকশন যোগ করা

Glance 1.1.0 ভার্সন থেকে, Glance আপনাকে ডিফল্ট সমস্যা সমাধানকারী কোড ওভাররাইড করতে দেয়। এইভাবে, আপনি কম্পোজিশনে কোনও আনকড ব্যতিক্রম বা ত্রুটি হলে অ্যাকশন কলব্যাক যোগ করতে পারবেন।

এই ফিচার ব্যবহার করতে, onCompositionError() ফাংশন ওভাররাইড করুন:

GlanceAppWidget.onCompositionError(
    context: Context,
    glanceId: GlanceId,
    appWidgetId: Int,
    throwable: Throwable
)

এই ফাংশনে, সমস্যা সমাধানের জন্য Glance RemoteViews API ব্যবহার করে। এটি আপনাকে XML ব্যবহার করে লেআউট ও অ্যাকশন হ্যান্ডলার নির্দিষ্ট করতে দেয়।

নিম্নলিখিত উদাহরণ থেকে, ধাপে ধাপে, কীভাবে এমন একটি সমস্যার UI তৈরি করতে হয় তা জানুন যা মতামত পাঠানোর জন্য একটি বোতাম অন্তর্ভুক্ত করে:

  1. error_layout.xml ফাইল লিখুন:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
       style="@style/Widget.MyApplication.AppWidget.Error"
       android:id="@android:id/background"
       android:layout_width="match_parent"
       android:textSize="24sp"
       android:layout_height="match_parent"
       android:orientation="vertical">
    
       <TextView
           android:id="@+id/error_title_view"
           android:layout_width="match_parent"
           android:textColor="@color/white"
           android:textFontWeight="800"
           android:layout_height="wrap_content"
           android:text="Example Widget Error" />
    
       <LinearLayout
           android:layout_width="match_parent"
           android:orientation="horizontal"
           android:paddingTop="4dp"
           android:layout_height="match_parent">
    
           <ImageButton
            android:layout_width="64dp"
            android:layout_height="64dp"
            android:layout_gravity="center"
            android:tint="@color/white"
            android:id="@+id/error_icon"
            android:src="@drawable/heart_broken_fill0_wght400_grad0_opsz24"
           />
           <TextView
               android:id="@+id/error_text_view"
               android:layout_width="wrap_content"
               android:textColor="@color/white"
               android:layout_height="wrap_content"
               android:layout_gravity="center"
               android:padding="8dp"
               android:textSize="16sp"
               android:layout_weight="1"
               android:text="Useful Error Message!" />
       </LinearLayout>
    
    </LinearLayout>
    

  2. onCompositionError ফাংশন ওভাররাইড করুন:

    override fun onCompositionError(
        context: Context, glanceId: GlanceId, appWidgetId: Int, throwable: Throwable
    ) {
        val rv = RemoteViews(context.packageName, R.layout.error_layout)
        rv.setTextViewText(
            R.id.error_text_view,
            "Error was thrown. \nThis is a custom view \nError Message: `${throwable.message}`"
        )
        rv.setOnClickPendingIntent(R.id.error_icon, getErrorIntent(context, throwable))
        AppWidgetManager.getInstance(context).updateAppWidget(appWidgetId, rv)
    }

  3. আপনার GlanceAppWidgetReceiver-এর রেফারেন্স সহ একটি পেন্ডিং ইনটেন্ট তৈরি করুন:

    private fun getErrorIntent(context: Context, throwable: Throwable): PendingIntent {
        val intent = Intent(context, UpgradeToHelloWorldPro::class.java)
        intent.action = "widgetError"
        return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_IMMUTABLE)
    }

  4. আপনার GlanceAppWidgetReceiver-এ অভিপ্রায় ম্যানেজ করুন:

    override fun onReceive(context: Context, intent: Intent) {
        super.onReceive(context, intent)
        Log.e("ErrorOnClick", "Button was clicked.")
    }