ফোকাসে প্রতিক্রিয়া জানানো

কম্পোজিশন ট্রি জুড়ে ফোকাস পরিবর্তন হলে, Compose একটি focus ইভেন্ট ফায়ার করে যা প্যারেন্ট ও চাইল্ড মডিফায়াররা দেখতে পায়। ফোকাস স্টেট ট্রানজিশন শুনতে, বর্তমান ফোকাস প্রপার্টি কোয়েরি করতে এবং স্টেট-ড্রিভেন UI আপডেট ট্রিগার করতে, আপনি onFocusChanged মডিফায়ার ব্যবহার করতে পারবেন।

onFocusChanged-এর মাধ্যমে ফোকাস স্টেট পর্যবেক্ষণ করা

কোনও এলিমেন্ট ফোকাস পেলে বা হারালে, onFocusChanged মডিফায়ার একটি FocusState অবজেক্ট প্রদান করে।

যেমন, কাস্টম কম্পোনেন্টের স্টেট আপডেট করার জন্য ফোকাস পরিবর্তন লক্ষ্য করতে পারেন (যেমন, কোনও এলিমেন্টের বর্ডার কালার পরিবর্তন করা বা অ্যানিমেশন ট্রিগার করা):

var color by remember { mutableStateOf(Color.White) }
Card(
    modifier = Modifier
        .onFocusChanged {
            color = if (it.isFocused) Red else White
        }
        .border(5.dp, color)
) {}

এই উদাহরণে, remember একাধিক রিকম্পোজিশন জুড়ে বর্ডার কালার সেভ করে এবং এলিমেন্টের ফোকাস স্টেট ট্রানজিশন করলেই বর্ডার কালার আপডেট হয়ে যায়।

FocusState প্রপার্টি

onFocusChanged-এ পাস করা FocusState অবজেক্টে তিনটি মূল প্রপার্টি থাকে:

  • isFocused: এই মডিফায়ারটি যে নির্দিষ্ট কম্পোজ করার উপযুক্ত আইটেমের সাথে অ্যাটাচ করা আছে সেটি বর্তমানে অ্যাক্টিভ ইনপুট ফোকাস হোল্ড করে থাকলে true রিটার্ন করে।
  • hasFocus: এই কম্পোজ করার মতো আইটেম বা এর কোনও চাইল্ড কম্পোজ করার মতো আইটেমে বর্তমানে ফোকাস থাকলে true রিটার্ন করে। এটি প্যারেন্ট কন্টেনারের (যেমন কার্ড বা টুলবার) জন্য উপযোগী, কারণ এর মাধ্যমে প্যারেন্ট কন্টেনার জানতে পারে যে তার মধ্যে থাকা কোনও চাইল্ড কন্টেনার অ্যাক্টিভ আছে কিনা।
  • isCaptured: ফোকাস বর্তমানে এলিমেন্টে লক করা থাকলে true রিটার্ন করে (যেমন, captureFocus() ব্যবহার করে মোডাল সাব-ইন্টার‍্যাকশনের সময়)। ক্যাপচার করা অবস্থায়, অন্য এলিমেন্টে ফোকাস সরানোর চেষ্টা করলে ফোকাস পরিষ্কার হয় না।
Modifier.onFocusChanged { focusState ->
    val isFocused = focusState.isFocused
    val hasFocus = focusState.hasFocus
    val isCaptured = focusState.isCaptured
}