الحالة في التطبيق هي أي قيمة يمكن أن تتغيّر بمرور الوقت. هذا تعريف شامل جدًا ويشمل كل شيء، بدءًا من قاعدة بيانات Room ووصولاً إلى متغيّر في الفئة.
تعرض جميع تطبيقات Android الحالة للمستخدم. في ما يلي بعض الأمثلة على الحالات في تطبيقات Android:
- شريط معلومات سريع يظهر عندما يتعذّر إنشاء اتصال بالشبكة
- مشاركة مدونة والتعليقات المرتبطة بها
- رسوم متحركة للتأثيرات المتموّجة على الأزرار يتم تشغيلها عندما ينقر المستخدم عليها
- الملصقات التي يمكن للمستخدم رسمها فوق صورة.
يساعدك Jetpack Compose في تحديد مكان تخزين الحالة وكيفية استخدامها في تطبيق Android بوضوح. ويركز هذا الدليل على الرابط بين الحالة وعناصر التركيب، وعلى واجهات برمجة التطبيقات التي يوفّرها Jetpack Compose للعمل مع الحالة بشكلٍ أكثر سهولة.
الحالة والتكوين
Compose عبارة عن دالة توضيحية، وبالتالي فإنّ الطريقة الوحيدة لتعديلها هي من خلال استدعاء
دالة التركيب نفسها مع وسيطات جديدة. هذه الوسيطات هي تمثيلات لحالة
واجهة المستخدم. في أي وقت يتم فيه تعديل حالة، يتم إجراء إعادة تركيب. ونتيجةً لذلك،
لا يتم تعديل عناصر مثل TextField
تلقائيًا كما هو الحال في
العروض المستندة إلى XML الإلزامية. يجب أن يتم إخبار العنصر القابل للتجميع صراحةً بالحالة الجديدة
لكي يتم تعديله وفقًا لذلك.
@Composable private fun HelloContent() { Column(modifier = Modifier.padding(16.dp)) { Text( text = "Hello!", modifier = Modifier.padding(bottom = 8.dp), style = MaterialTheme.typography.bodyMedium ) OutlinedTextField( value = "", onValueChange = { }, label = { Text("Name") } ) } }
إذا شغّلت هذا الخيار وحاولت إدخال نص، فلن يحدث شيء. ويعود سبب ذلك إلى أنّه
لا يتم تعديل TextField
تلقائيًا، بل يتم تعديله عند تغيير المَعلمة value
. ويرجع ذلك إلى آلية عمل عملية الإنشاء وإعادة الإنشاء في
Compose.
للاطّلاع على مزيد من المعلومات عن عملية الإنشاء الأولي وإعادة الإنشاء، اطّلِع على مقالة التفكير في وضع "الإنشاء".
الحالة في العناصر القابلة للتجميع
يمكن للدوالّ القابلة للتجميع استخدام واجهة برمجة التطبيقات
remember
لتخزين عنصر في الذاكرة. يتم تخزين القيمة التي يتم احتسابها بواسطة remember
في التركيب أثناء التركيب الأولي، ويتم عرض القيمة المخزّنة أثناء إعادة التركيب.
يمكن استخدام remember
لتخزين كلّ من الكائنات القابلة للتغيير وغير القابلة للتغيير.
mutableStateOf
تُنشئ مراقبة
MutableState<T>
،
وهو نوع مراقبة مدمج مع وقت تشغيل Compose.
interface MutableState<T> : State<T> {
override var value: T
}
تؤدي أي تغييرات على value
إلى إعادة تركيب أي دوال قابلة للتجميع
تقرأ value
.
هناك ثلاث طرق لتعريف عنصر MutableState
في عنصر قابل للتجميع:
val mutableState = remember { mutableStateOf(default) }
var value by remember { mutableStateOf(default) }
val (value, setValue) = remember { mutableStateOf(default) }
هذه التعريفات متكافئة، ويتم تقديمها كطريقة سهلة لاستخدام بنية الجملة في استخدامات مختلفة لـ state. عليك اختيار الرمز الذي ينتج عن العبارة العبارة السهلة القراءة في العبارة المركبة التي تكتبها.
تتطلّب بنية التفويض by
عمليات الاستيراد التالية:
import androidx.compose.runtime.getValue
import androidx.compose.runtime.setValue
يمكنك استخدام القيمة التي تم تذكُّرها كمَعلمة للعناصر القابلة للتجميع الأخرى أو حتى كأحد
المنطق في العبارات لتغيير العناصر القابلة للتجميع التي يتم عرضها. على سبيل المثال، إذا
لم تكن تريد عرض التحية إذا كان الاسم فارغًا، استخدِم الحالة في عبارة
if
:
@Composable fun HelloContent() { Column(modifier = Modifier.padding(16.dp)) { var name by remember { mutableStateOf("") } if (name.isNotEmpty()) { Text( text = "Hello, $name!", modifier = Modifier.padding(bottom = 8.dp), style = MaterialTheme.typography.bodyMedium ) } OutlinedTextField( value = name, onValueChange = { name = it }, label = { Text("Name") } ) } }
على الرغم من أنّ remember
يساعدك في الاحتفاظ بالحالة في عمليات إعادة التركيب، لا يتم
الاحتفاظ بالحالة في عمليات تغيير الإعدادات. لإجراء ذلك، يجب استخدام
rememberSaveable
. يحفظ rememberSaveable
تلقائيًا أي قيمة يمكن
حفظها في Bundle
. بالنسبة إلى القيم الأخرى، يمكنك تمرير عنصر مخصّص لجهاز الحفظ.
أنواع الحالات الأخرى المتوافقة
لا تتطلّب ميزة "الإنشاء" استخدام MutableState<T>
للاحتفاظ بالحالة، إذ
تتيح استخدام أنواع أخرى من العناصر القابلة للتتبّع. قبل قراءة نوع آخر من أنواع العناصر القابلة للتتبّع في
Compose، يجب تحويله إلى State<T>
حتى تتمكّن العناصر القابلة للتجميع من
إعادة التركيب تلقائيًا عند تغيُّر الحالة.
يتم شحن أداة الإنشاء مع دوال لإنشاء State<T>
من أنواع رصد
الشائعة المستخدَمة في تطبيقات Android. قبل استخدام عمليات الدمج هذه، أضِف العناصر المناسبة كما هو موضّح أدناه:
Flow
:collectAsStateWithLifecycle()
يجمع
collectAsStateWithLifecycle()
القيم منFlow
بطريقة تراعي رحلة المستخدِم، ما يسمح لتطبيقك بالادخار موارد التطبيق. ويمثّل أحدث قيمة تمّ بثّها منState
. يمكنك استخدام واجهة برمجة التطبيقات هذه باعتبارها الطريقة الموصى بها لجمع بيانات التدفق على تطبيقات Android.تكون التبعية التالية مطلوبة في ملف
build.gradle
(يجب أن تكون بالإصدار 2.6.0-beta01 أو إصدار أحدث):
dependencies {
...
implementation("androidx.lifecycle:lifecycle-runtime-compose:2.8.7")
}
dependencies {
...
implementation "androidx.lifecycle:lifecycle-runtime-compose:2.8.7"
}
-
تشبه الدالة
collectAsState
الدالةcollectAsStateWithLifecycle
، لأنّها أيضًا تجمع القيم منFlow
وتحوّلها إلى ComposeState
.استخدِم
collectAsState
للرمز البرمجي غير المرتبط بالنظام الأساسي بدلاً منcollectAsStateWithLifecycle
المخصّص لنظام Android فقط.لا يلزم توفُّر تبعيات إضافية لـ
collectAsState
، لأنّه متاح فيcompose-runtime
. -
يبدأ
observeAsState()
في ملاحظةLiveData
هذا ويمثل قيمه من خلالState
.الاعتمادية التالية مطلوبة في ملف
build.gradle
:
dependencies {
...
implementation("androidx.compose.runtime:runtime-livedata:1.7.8")
}
dependencies {
...
implementation "androidx.compose.runtime:runtime-livedata:1.7.8"
}
-
subscribeAsState()
هي دوالّ إضافية تحوّل تدفقات التفاعلية في RxJava2 (مثلSingle
وObservable
Completable
) إلى ComposeState
.الاعتمادية التالية مطلوبة في ملف
build.gradle
:
dependencies {
...
implementation("androidx.compose.runtime:runtime-rxjava2:1.7.8")
}
dependencies {
...
implementation "androidx.compose.runtime:runtime-rxjava2:1.7.8"
}
-
subscribeAsState()
هي دوالّ إضافية تحوّل تدفقات التفاعلية في RxJava3 (مثلSingle
وObservable
Completable
) إلى ComposeState
.يجب إدراج التبعية التالية في ملف
build.gradle
:
dependencies {
...
implementation("androidx.compose.runtime:runtime-rxjava3:1.7.8")
}
dependencies {
...
implementation "androidx.compose.runtime:runtime-rxjava3:1.7.8"
}
جدار الحماية المتتبِّع لحالة الاتصال مقابل جدار الحماية غير المتتبِّع لحالة الاتصال
إنّ العنصر القابل للتجميع الذي يستخدم remember
لتخزين عنصر ينشئ حالة داخلية،
ما يجعل العنصر القابل للتجميع يعتمد على الحالة. HelloContent
هو مثال على حالة قابلة للإنشاء
لأنّها تحتفظ بحالة name
الخاصة بها وتعدِّلها داخليًا. يمكن أن يكون ذلك مفيداً في الحالات التي لا يحتاج فيها المتصل إلى التحكّم في الحالة ويمكنه استخدامها بدون الحاجة إلى إدارة الحالة بنفسه. ومع ذلك، تكون العناصر القابلة للتجميع التي تحتوي على
حالة داخلية أقل قابلية لإعادة الاستخدام ويصعب اختبارها.
العنصر القابل للتجميع غير المحدد الحالة هو عنصر قابل للتجميع لا يحتفظ بأي حالة. إنّ إحدى الطرق السهلة لتحقيق وظائف بدون حالة هي استخدام حالة الرفع.
أثناء تطوير مكونات قابلة لإعادة الاستخدام، غالبًا ما تريد عرض إصدار يعتمد على الحالة وإصدار لا يعتمد على الحالة من المكوّن نفسه. يكون الإصدار الذي يتضمّن حالة مناسبًا للمتصلين الذين لا يهتمون بالحالة، ويكون الإصدار الذي لا يتضمّن حالة ضروريًا للمتصلين الذين يحتاجون إلى التحكّم في الحالة أو رفعها.
الرفع إلى الولاية
إن رفع الحالة في Compose هو نمط الانتقال إلى متصل ضِمن المحتوى القابل للإنشاء لجعله غير مرتبط بالحالة. النمط العام لرفع الحالة في Jetpack Compose هو استبدال متغيّر الحالة بمعاملتَين:
value: T
: القيمة الحالية المطلوب عرضهاonValueChange: (T) -> Unit
: حدث يطلب تغيير القيمة، حيث يكونT
هو القيمة الجديدة المقترَحة
ومع ذلك، يمكنك استخدام onValueChange
أو أيّ تنسيق آخر. إذا كانت هناك أحداث أكثر تحديدًا
مناسبة للعنصر القابل للإنشاء، عليك تحديدها باستخدام الدوالّ اللامدا.
إنّ الحالة التي يتمّ رفعها بهذه الطريقة لها بعض السمات المهمة:
- مصدر واحد للحقيقة: من خلال نقل الحالة بدلاً من تكرارها، نضمن توفّر مصدر واحد للحقيقة. ويساعد ذلك في تجنّب الأخطاء.
- مُدمجة: يمكن فقط للعناصر القابلة للتجميع التي تتضمّن حالة تعديل حالتها. وهو داخلي بالكامل.
- قابلة للمشاركة: يمكن مشاركة الحالة المُرفوعة مع عناصر قابلة للتجميع متعددة. إذا أردت قراءة
name
بطريقة مختلفة قابلة للإنشاء، تتيح لك رفع الصوت ذلك. - غير قابل للإنشاء: يمكن للمتصلين إلى العناصر القابلة للإنشاء التي لا تتضمّن حالة اختيار تجاهل الأحداث أو تعديلها قبل تغيير الحالة.
- غير مرتبطة: يمكن تخزين حالة العناصر القابلة للتجميع التي لا تتضمّن حالة في أي مكان. على سبيل المثال، أصبح من الممكن الآن نقل
name
إلىViewModel
.
في المثال، يمكنك استخراج name
وonValueChange
من
HelloContent
ونقلها إلى أعلى الشجرة إلى HelloScreen
قابلة للتجميع تُدخِل
HelloContent
.
@Composable fun HelloScreen() { var name by rememberSaveable { mutableStateOf("") } HelloContent(name = name, onNameChange = { name = it }) } @Composable fun HelloContent(name: String, onNameChange: (String) -> Unit) { Column(modifier = Modifier.padding(16.dp)) { Text( text = "Hello, $name", modifier = Modifier.padding(bottom = 8.dp), style = MaterialTheme.typography.bodyMedium ) OutlinedTextField(value = name, onValueChange = onNameChange, label = { Text("Name") }) } }
من خلال رفع الحالة من HelloContent
، يصبح من الأسهل التفكير في
العنصر القابل للتجميع وإعادة استخدامه في حالات مختلفة واختباره. تم
فصل HelloContent
عن طريقة تخزين حالته. ويعني ذلك أنّه في حال تعديل HelloScreen
أو
استبداله، لن يكون عليك تغيير كيفية
تنفيذ HelloContent
.

يُعرف النمط الذي تنخفض فيه الحالة وتزيد فيه الأحداث باسم
تدفق البيانات أحادي الاتجاه. في هذه الحالة، تنخفض الحالة من HelloScreen
إلى HelloContent
وترتفع الأحداث من HelloContent
إلى HelloScreen
. من خلال
اتّباع تدفق البيانات أحادي الاتجاه، يمكنك فصل العناصر القابلة للتجميع التي تعرِض
الحالة في واجهة المستخدم عن أجزاء تطبيقك التي تخزِّن الحالة وتغيّرها.
اطّلِع على صفحة مكان الرفع لمعرفة المزيد من المعلومات.
استعادة الحالة في ميزة "الإنشاء"
تعمل واجهة برمجة التطبيقات rememberSaveable
بالطريقة نفسها التي تعمل بها remember
لأنّها تحافظ على الحالة في عمليات إعادة التركيب، وكذلك في عمليات إعادة إنشاء النشاط أو العملية باستخدام آلية حالة النسخة المحفوظة. على سبيل المثال، يحدث ذلك عند تدوير الشاشة.
طُرق تخزين الحالة
يتم تلقائيًا حفظ جميع أنواع البيانات التي تتم إضافتها إلى Bundle
. إذا أردت حفظ عنصر لا يمكن إضافته إلى Bundle
، هناك
العديد من الخيارات.
Parcelize
أبسط حلّ هو إضافة التعليق التوضيحي
@Parcelize
إلى الجسم. يصبح العنصر قابلاً للتقسيم ويمكن تجميعه. على سبيل المثال، تنشئ هذه التعليمة البرمجية نوع بيانات City
قابلاً للتقسيم وتحفظه في القيمة
state.
@Parcelize data class City(val name: String, val country: String) : Parcelable @Composable fun CityScreen() { var selectedCity = rememberSaveable { mutableStateOf(City("Madrid", "Spain")) } }
أداة حفظ الخرائط
إذا لم تكن @Parcelize
مناسبة لأي سبب، يمكنك استخدام mapSaver
لتحديد قاعدتك الخاصة لتحويل عنصر إلى مجموعة من القيم التي يمكن للنظام حفظها في Bundle
.
data class City(val name: String, val country: String) val CitySaver = run { val nameKey = "Name" val countryKey = "Country" mapSaver( save = { mapOf(nameKey to it.name, countryKey to it.country) }, restore = { City(it[nameKey] as String, it[countryKey] as String) } ) } @Composable fun CityScreen() { var selectedCity = rememberSaveable(stateSaver = CitySaver) { mutableStateOf(City("Madrid", "Spain")) } }
أداة حفظ القوائم
لتجنّب الحاجة إلى تحديد مفاتيح الخريطة، يمكنك أيضًا استخدام listSaver
واستخدام مؤشراتها كمفاتيح:
data class City(val name: String, val country: String) val CitySaver = listSaver<City, Any>( save = { listOf(it.name, it.country) }, restore = { City(it[0] as String, it[1] as String) } ) @Composable fun CityScreen() { var selectedCity = rememberSaveable(stateSaver = CitySaver) { mutableStateOf(City("Madrid", "Spain")) } }
عناصر الاحتفاظ بالحالة في ميزة "الإنشاء"
يمكن إدارة عملية رفع الحالة البسيطة في الدوال القابلة للإنشاء نفسها. ومع ذلك، إذا ظهر مقدار الحالة التي يجب استخدامها لتتبُّع الزيادات، أو ظهر المنطق الذي يجب تنفيذه في الدوال القابلة للإنشاء، يكون تفويض مسؤوليات المنطق والدولة إلى الفئات الأخرى: أصحاب الحالات.
للاطّلاع على مزيد من المعلومات، يمكنك الاطّلاع على مستندات نقل الحالة في أداة Compose أو على صفحة حاملو الحالة وحالة واجهة المستخدم في دليل التصميم بشكلٍ عام.
إعادة تشغيل عمليات احتساب ميزة "تذكر كلمات المرور" عند تغيير المفاتيح
يتم استخدام واجهة برمجة التطبيقات remember
بشكلٍ متكرّر مع MutableState
:
var name by remember { mutableStateOf("") }
في هذه الحالة، يؤدي استخدام الدالة remember
إلى الاحتفاظ بقيمة MutableState
في عمليات
إعادة التركيب.
بشكل عام، تأخذ الدالة remember
مَعلمة لامدا calculation
. عند تشغيل remember
للمرة الأولى، يتمّ استدعاء دالة lambda calculation
وتخزين نتيجتها. أثناء
إعادة التركيب، تعرض remember
القيمة التي تم تخزينها آخر مرة.
بخلاف حالة التخزين المؤقت، يمكنك أيضًا استخدام remember
لتخزين أي عنصر أو
نتيجة لعملية في المقطوعة الموسيقية يكون إعدادها أو
احتسابها مكلفًا. قد لا تحتاج إلى تكرار هذا الحساب في كل عملية إعادة تركيب.
على سبيل المثال، إنشاء عنصر ShaderBrush
هذا، وهو عملية
مكلفة:
val brush = remember { ShaderBrush( BitmapShader( ImageBitmap.imageResource(res, avatarRes).asAndroidBitmap(), Shader.TileMode.REPEAT, Shader.TileMode.REPEAT ) ) }
تخزّن remember
القيمة إلى أن تتم إزالة المقطوعة الموسيقية. ومع ذلك، هناك
طريقة لإبطال القيمة المخزّنة مؤقتًا. تستخدم واجهة برمجة التطبيقات remember
أيضًا المَعلمة key
أو keys
. إذا تغيّر أيّ من هذه المفاتيح، فإنّه في المرة التالية التي تتم فيها إعادة إنشاء الدالة، يلغي remember
ذاكرة التخزين المؤقت وينفّذ عملية احتساب كتلة lambda مرة أخرى. تمنحك هذه الآلية إمكانية التحكم في فترة بقاء
كائن في المقطوعة الموسيقية. وتظل العملية الحسابية صالحة إلى أن تتغير الإدخالات، بدلاً من أن تغادر القيمة التي تم تذكرها المقطوعة الموسيقية.
توضح الأمثلة التالية آلية عمل هذه الآلية.
في هذا المقتطف، تم إنشاء ShaderBrush
واستخدامه كخلفية
لوحة ألوان لعنصر Box
قابل للتركيب. تخزِّن remember
المثيل ShaderBrush
لأن إعادة إنشائها تكون مكلفة، كما أوضحنا سابقًا. يأخذ remember
avatarRes
كمَعلمة key1
، وهي صورة الخلفية المحدّدة. إذا حدث تغيير في
avatarRes
، تتم إعادة إنشاء الفرشاة باستخدام الصورة الجديدة، ويتم إعادة تطبيقها على
Box
. ويمكن أن يحدث ذلك عندما يختار المستخدم صورة أخرى لتكون
الخلفية من أداة اختيار.
@Composable private fun BackgroundBanner( @DrawableRes avatarRes: Int, modifier: Modifier = Modifier, res: Resources = LocalContext.current.resources ) { val brush = remember(key1 = avatarRes) { ShaderBrush( BitmapShader( ImageBitmap.imageResource(res, avatarRes).asAndroidBitmap(), Shader.TileMode.REPEAT, Shader.TileMode.REPEAT ) ) } Box( modifier = modifier.background(brush) ) { /* ... */ } }
في المقتطف التالي، يتم تصعيد الحالة إلى فئة حامل حالة عادية
MyAppState
. ويعرِض دالة rememberMyAppState
لتهيئة
مثيل من الفئة باستخدام remember
. إن الكشف عن هذه الدوال لإنشاء مثيل يحافظ على إعادة التركيب هو نمط شائع في Compose. تتلقّى الدالة
rememberMyAppState
العنصر windowSizeClass
، الذي يُستخدَم كمَعلمة
key
للدالة remember
. في حال تغيّرت هذه المَعلمة، يحتاج التطبيق إلى
إعادة إنشاء فئة حامل الحالة العادية باستخدام القيمة الأخيرة. وقد يحدث ذلك مثلاً إذا غيّر المستخدم وضع الجهاز.
@Composable private fun rememberMyAppState( windowSizeClass: WindowSizeClass ): MyAppState { return remember(windowSizeClass) { MyAppState(windowSizeClass) } } @Stable class MyAppState( private val windowSizeClass: WindowSizeClass ) { /* ... */ }
تستخدِم الدالة Compose طريقة تنفيذ equals في الفئة لتحديد ما إذا كان المفتاح قد تغيّر وإبطال القيمة المخزّنة.
تخزين الحالة باستخدام مفاتيح بعد إعادة التركيب
واجهة برمجة التطبيقات rememberSaveable
هي برنامج تضمين لواجهة برمجة التطبيقات remember
يمكنه تخزين data في Bundle
. لا تسمح واجهة برمجة التطبيقات هذه ببقائها في حالة إعادة التركيب فحسب، بل تسمح أيضًا بإعادة إنشاء النشاط وإيقاف العملية التي بدأها النظام.
تتلقّى rememberSaveable
مَعلمات input
للغرض نفسه الذي تتلقّى فيه
remember
مَعلمات keys
. تصبح ذاكرة التخزين المؤقت غير صالحة عند
تغيُّر أيّ من المدخلات. في المرة التالية التي تتم فيها إعادة تركيب الدالة، يُعيد rememberSaveable
تنفيذ
وحدة LAMBDA الحسابية.
في المثال التالي، يخزِّن rememberSaveable
القيمة userTypedQuery
إلى أن يتم تغيير
typedQuery
:
var userTypedQuery by rememberSaveable(typedQuery, stateSaver = TextFieldValue.Saver) { mutableStateOf( TextFieldValue(text = typedQuery, selection = TextRange(typedQuery.length)) ) }
مزيد من المعلومات
لمزيد من المعلومات عن الحالة وJetpack Compose، يمكنك الرجوع إلى المراجع التالية الإضافية.
نماذج
تتيح Microsoft للمستخدمين والمؤسسات العمل والتعلّم والتنظيم والتواصل والابتكار من خلال تطبيقاتهم الرائدة في Microsoft 365. ولتحقيق ذلك، تدرك الشركة أنّه من الضروري توفير تجربة إنتاجية مثالية لعملائها على جميع الأجهزة التي يستخدمونها. تساعد منصّة Square ملايين البائعين في إدارة
نشاطك التجاري، بدءًا من المعالجة الآمنة لبطاقات الائتمان ووصولاً إلى حلول نقاط البيع
إعداد متجر مجاني على الإنترنت. تم نقل المربع إلى واجهة المستخدم التعريفية
لفترة من الوقت ولكن بدلاً من الاستمرار في بناء Monzo هو مصرف وتطبيق يقدّمان
الخدمات المالية الرقمية. مهمتهم هي تحقيق الأرباح
للجميع. بدأ نظام تصميم مونزو ينحرف عن Material Design بحيث
أرادوا طريقة سهلة لكتابة المكوّنات المخصصة وصيانتها تتطوّر باستمرار، لذا اختارت Jetpack Compose. باستخدام منصة Twitter هي واحدة من أكثر وسائل التواصل الاجتماعي استخدامًا
ومنصات الوسائط التي تتيح للمستخدمين رؤية ما يحدث في العالم في أي وقت
اللحظة. بدأ الفريق الهندسي باستخدام Jetpack Compose لتجديد
نظام التصميم. بما أنّه تم تطوير مكونات واجهة المستخدم شركة Cuvva تحسّن التأمين بشكل كبير
من خلال منحك طريقة مرنة حقًا لإدارة الغلاف، كل ذلك من خلال هاتفك.
كان على مهندسي Android في Cuvva قضاء بعض الوقت في إعادة هندسة تطبيقاتهم
وقررت اعتماد تدفق بيانات أحادي الاتجاه وJetpack Compose. بهذه الطريقة
يمكنهم ShareChat is a leading social media platform in India that allows users to share their opinions, document their lives, and make new friends in their native language. The standard Red Up Green Down color scheme that many wealth management app users take for granted can be very problematic for colorblind users and those with color vision deficiency.The Futubull team is embracing users’ needs by making concrete improvements so that everyone can grasp the key to wealth. TikTok, the world’s community-driven entertainment destination, brings over 1 billion people together from around the world to discover, create and share content they love. OkCredit is a credit account management app for millions of shop owners and their customers in India. With 140M transactions month over month, and 50M+ downloads, last year alone saw OkCredit recording $50 billion worth of transactions on the app. Operating at such a huge scale scale, OkCredit created a smooth and seamless experience for all their users by focusing on reducing ANRs and improving the app startup time. Lyft is committed to app excellence. They have to be. For a rideshare app — providing a vital, time-sensitive service to millions of drivers and riders every day — a slow or unresponsive app adds unacceptable friction. Josh is a short-video app from India, launched in 2020. One of the fastest growing short-video apps with over 124 million MAUs, optimizing it across a range of devices (high, mid, low end) and maintaining a standard experience across all of them is critical for their success. Improving app startups time and making the app responsive helped them achieve success. Microsoft Lens increases developer productivity using CameraX Zomato is an Indian multinational restaurant aggregator and food delivery company serving customers across 500 cities in India alone. In order to launch new features on their Android app, Headspace spent 8 months refactoring their architecture and rewriting in Kotlin. Learn how this reboot helped their business grow. Google Photos is the home for your memories, and their development team believes people should be able to enjoy those memories across all devices. Learn how Duolingo made the business decision to focus on Android performance and how they improved developer productivity and scaled their business. Mercari allows millions of people to shop and sell almost anything. The company was founded in 2013 in Japan, and it now is the largest smartphone-focused C2C marketplace in Japan. Google Duo is a simple, high quality video calling app for everyone. With the increase of people being at home during the Covid-19 pandemic, the Duo team saw a significant increase in people using the app to stay connected with friends & family, school and work. Headspace drive business growth by investing in Android app quality. SmartNews helps millions of people discover their world everyday by sharing timely news from a diverse set of news sources. Twitter is one of the most widely used social media platforms where users can see what’s happening in the world at any given moment. Delight Room Alarmy is an alarm app that can be turned off only when the pre-selected activities, such as taking a photo, solving a math problem, shaking phone, etc., are performed by the user. The Google Home app helps set up, manage, and control your Google Home, Google Nest, and Chromecast devices—plus thousands of connected home products like lights, cameras, thermostats, and more. Truecaller is an app that offers caller identification, call blocking, chat messaging and organized inbox. The app has a basic offering and a premium version which is ad-free and has a variety of unlocked features like advanced spam blocking and call recording.تمكّنت Microsoft Outlook وTeams وOffice من زيادة عدد المستخدمين النشطين والاحتفاظ بالمستخدمين باستخدام الشاشات الكبيرة.
يحقّق المربع زيادة في الإنتاجية باستخدام Compose
تنشئ Monzo تطبيقًا أكثر فعالية وجودة باستخدام Compose
شركة Twitter تحقّق زيادة في كفاءة وسرعة المطوّرين باستخدام Compose
تنشئ شركة Cuvva أكثر سرعة وبجودة أعلى من خلال Compose.
ShareChat addresses Jank issues to increase feed scrolling by 60%
The Key to Wealth for Everyone
TikTok Optimizes User Experience with Android Tools
OkCredit’s average merchant transaction goes up by 30% after reducing ANR
Lyft improves Android app startup time for drivers by 21%
Josh sees increased customer retention by improving app startup time by 30%
Microsoft Lens increases developer productivity using CameraX
Increasing app speed by 30%: a key ingredient in Zomato’s growth recipe
Headspace's Android reboot increases monthly active users by 15%
Google Photos increased daily active users by building for large screens
Duolingo refactors on Android with MVVM and Jetpack libraries
Mercari improves UI development productivity by 56% with Jetpack Compose
Google Duo sees increased engagement and improved ratings by optimizing for larger screens
Headspace drive business growth by investing in Android app quality
SmartNews reduces lines of code by 20% and improves team morale with Kotlin
Twitter increases developer productivity and code reliability with Kotlin
Delight Room increased 90% of its organic US users with Play Console
Google Home reduces #1 cause of crashes by 33%
Truecaller brings ~40% subscribers back with real time developer notifications
الدروس التطبيقية حول الترميز
الفيديوهات
المدوّنات
ما من اقتراحات في الوقت الحالي.
يُرجى محاولة تسجيل الدخول إلى حسابك على Google.