Android Corner
Android Corner
خواندن ۴ دقیقه·۱ سال پیش

اخبار هفته

Android Corner

?

نسخه‌ی Compose Multiplatform 1.5.0

تغییرات این نسخه هیجان‌انگیزه. کلا تغییرات KMP برای من خیلی جذابه(:

کامپوز برای دسکتاپ stableه، برای iOS تو حالت alpha و برای وب هم تو حالت experimental قرار داره.

این نسخه براساس Jetpack Compose 1.5 هستش که تمرکزاش روی performanceه. همچنین تو این نسخه، از نسخه 1.1 Material Design 3 میتونید استفاده کنید که یه‌سری امکانات جدید داره.

پشتیبانی Compose Multiplaform از dialog ها، popup ها و windowInset

از حالا به بعد دیگه نیاز ندارین برای همه پلتفرم‌ها کد‌های جداگانه بنویسین برای ساخت Dialog و Popup DropdownMenu و AlertDialog. با داشتن یکدیگر تیکه کد برای مثلا AlertDialog، تو همه پلتفرم‌ها ازش استفاده کنید:

Composable fun CommonDialog() { var isDialogOpen by remember { mutableStateOf(false) } Button( = { isDialogOpen = true }) { Text(&quotOpen&quot) } if (isDialogOpen) { AlertDialog( onDismissRequest = { }, confirmButton = { Button( = { isDialogOpen = false }) { Text(&quotOK&quot) } }, title = { Text(&quotAlert Dialog&quot) }, text = { Text(&quotLore ipsum&quot) }, ) } }
?



?

از طریق windowInset هم میتونین محتواتون رو با system ui یکی کنید یه همچین چیزی:


?

پیشرفت های iOS

1- پیمایش یا اسکرول‌کردن طبیعی: تو این نسخه اسکرول‌کردن توی iOS مثل اسکرول‌کردن بومی خود iOS شده. مثلا:

@Composable fun NaturalScrolling() { val items = (1..30).map { &quotItem $it&quot } LazyColumn { items(items) { Text( text = it, fontSize = 30.sp, modifier = Modifier.padding(start = 20.dp) ) } } }

اینجوری میشه، مثل اپلیکیشن‌های native:


?

2- پشتیبانی از Dynamic Type: این ویژگی Dynamic Type تو iOS به کاربر امکان میده تا فونت سایز دلخواه‌اش رو تنظیم کنه. کاربر می‌تونه تو setting و اون text size گوشی رو حالت دلخواه از max تا min تنظیم کنن.

@Composable fun DynamicType() { Text(&quotThis is some sample text&quot, fontSize = 30.sp) }

اینجوری:


?

پشتیبانی از high-refresh rate display: توی ورژن‌های قبلی ماکزیمم فریم‌ریت 60 FPS بوده که منجر به کُند و لَگی بودن ui (تو دستگاه‌های با صفحه 120Hz) میشد. ولی تو این نسخه فریم‌ریت تا 120 فریم در ثانیه پشتیبانی می‌شه.

3- ساده‌شدن مدیریت resource ها: دیگه لازم نیست asset های پوشه resource توی iOS رو توی یه bundle کپی کنید‌.

4- و یه‌سری بهبودی‌هایی توی TextField و صفحه کلید داشتیم.

پیشرفت‌های دسکتاپ

1- پایدارشدن فریمورک تست برای تست کردن ui بدون محدودیت:

@Composable fun App() { var searchText by remember { mutableStateOf(&quotcats&quot) } val searchHistory = remember { mutableStateListOf<String>() } Column(modifier = Modifier.padding(30.dp)) { TextField( modifier = Modifier.testTag(&quotsearchText&quot), value = searchText, onValueChange = { searchText = it } ) Button( modifier = Modifier.testTag(&quotsearch&quot), = { searchHistory.add(&quotYou searched for: $searchText&quot) } ) { Text(&quotSearch&quot) } LazyColumn { items(searchHistory) { Text( text = it, fontSize = 20.sp, modifier = Modifier.padding(start = 10.dp).testTag(&quotattempt&quot) ) } } } }

نتیجه این کد، این میشه:


?

خب بیاین با JUnit تست‌اش کنیم:

class SearchAppTest { @get:Rule val compose = createComposeRule() @Test fun `Should display search attempts`() { compose.setContent { App() } val testSearches = listOf(&quotcats&quot, &quotdogs&quot, &quotfish&quot, &quotbirds&quot) for (text in testSearches) { compose.onNodeWithTag(&quotsearchText&quot).performTextReplacement(text) compose.onNodeWithTag(&quotsearch&quot).performClick() } val lastAttempt = compose .onAllNodesWithTag(&quotattempt&quot) .assertCountEquals(testSearches.size) .onLast() val expectedText = &quotYou searched for: ${testSearches.last()}&quot lastAttempt.assert(hasText(expectedText)) } }

2- این نسخه، پشتیبانیِ آزمایشی رو برای بهبود رندرکردن پنل‌های کامپوز توی کامپوننت‌های Swing رو هم ارائه میده. این مانع از مشکلات رندر انتقالی(transition) هنگام نمایش، پنهان یا تغییر اندازه پنل‌ها می شود.

fun main() { System.setProperty(&quotcompose.swing.render.on.graphics&quot, &quottrue&quot) SwingUtilities.invokeLater { val composePanel = ComposePanel().apply { setContent { Box(modifier = Modifier.background(Color.Black).fillMaxSize()) } } val popup = object : JComponent() { ... } val rightPanel = JLayeredPane().apply { add(composePanel) add(popup) ... } val leftPanel = JPanel().apply { background = CYAN } val splitter = JSplitPane(..., leftPanel,rightPanel) JFrame().apply { add(splitter) setSize(600, 600) isVisible = true } } }

لوگوی جدید برای ربات اندروید(Bugdroid)

گوگل لوگوی جدیدی رو برای برند اندروید معرفی کرده و میگه که از این به بعد قراره همه جا ببینیدش:


?

آخرین ARTwork روی صدها میلیون دستگاه

بروزرسانی های سیستم گوگل‌پلی برای android runtime، یه سری بهبودی هایی رو به همراه داشته البته برای اندروید 12 به بالا و گفته‌که android go هم بزودی از این آپدیت بهره‌مند میشه:

1- پیشرفت‌های عملکرد: این بروز‌رسانی‌ها شامل بهینه‌سازی در زمان اجرا و کامپایلر هستش که باعث بهبود زمان startup برنامه، سرعت اجرای برنامه و استفاده از حافظه می شود.

2- رفع مشکلات امنیتی: همچنین ماژولار بودن ART اجازه می‌ده تا اصلاحات امنیتی به سرعت در دستگاه های اندرویدی قراربگیرن که درنتیجه باعث میشه آسیب پذیری ها را pacth کنند.

3- سازگاری سریع‌تر با ویژگی‌های جدید جاوا: این بروزرسانی سرعت پشتیبانی از نسخه‌های جدیدتر Java / OpenJDK رو به دستگاه های Android فراهم می‌کنه و به ما این امکان رو می‌ده تا از جدیدترین ویژگی های زبان استفاده کنیم.

برای خوندن جزییات مقاله.

ی: Library releases

آخرین نسخه از Dagger and Hilt — v2.48 شامل نسخه alpha از KSP processor هست. الان دیگه با خیال راحت میتونید از kapt به ksp مهاجرت کنید‌‌.

یه‌سری تغییرات هم داشته که اینجا میتونین ببینین.

برای استفاده از ksp این رو دنبال کنید.

برای مهاجرت‌تون این مقاله رو بخونید.

اینا رو هم بخونین ضرری نداره:

1. بخش article های این لینک رو هم ببینید جالبه.

2. این لینک.

کانال:Android Corner / ایمیل: cornerdroid@gmail.com

اینجا جاییکه در مورد مسائل و اخبار اندرویدی حرف میزنیم. cornerdroid@gmail.com / کانال: https://t.me/AndroidCorner
شاید از این پست‌ها خوشتان بیاید