واکنش به فوکوس

هر بار که تمرکز در سراسر درخت ترکیب تغییر می‌کند، Compose رویداد focus را راه‌اندازی می‌کند که اصلاح‌کننده‌های والد و فرزند می‌توانند آن را مشاهده کنند. می‌توانید از 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

شیء FocusState که به onFocusChanged ارسال شده است سه ویژگی کلیدی دارد:

  • isFocused: اگر عنصر ترکیبی خاصی که این اصلاح‌گر به آن پیوست شده است درحال‌حاضر تمرکز ورودی فعال را داشته باشد، true را برمی‌گرداند.
  • hasFocus: اگر این عنصر ترکیبی یا هریک از عناصر ترکیبی فرزند آن درحال‌حاضر تمرکز داشته باشد، true را برمی‌گرداند. این برای محتویات والد (مثل کارت‌ها یا نوارابزارها) که باید بدانند چه زمانی هر فرزند درون آن‌ها فعال است مفید است.
  • isCaptured: اگر تمرکز درحال‌حاضر روی عنصر قفل شده باشد (برای مثال، درطول تعاملات فرعی مُدال بااستفاده از captureFocus())، true را برمی‌گرداند. وقتی تمرکز ضبط می‌شود، تلاش برای انتقال تمرکز به عناصر دیگر باعث پاک شدن تمرکز نمی‌شود.
Modifier.onFocusChanged { focusState ->
    val isFocused = focusState.isFocused
    val hasFocus = focusState.hasFocus
    val isCaptured = focusState.isCaptured
}