JetPack Compose 學習筆記(持續整理中...)

1.為什么要學?

?1.命令式和聲明式 UI大戰,個人認為命令式UI自定義程度較高,能更深入到性能,內存優化方面,而申明式UI 是現在主流的設計,比如React,React Native,Flutter,Swift UI等等,現在性能也逐漸在變得更好
2.還有一個原因compose 是KMM 是完整跨平臺的UI基礎
3.聲明式UI 個人覺得是非常適合MVVM的設計的,比android databinding 實現的xml 里面綁定vm 更適合,聲明式UI一般都是基于狀態管理的,只需要處理狀態,至于怎么組合,怎么刷新比對 是框架給處理好的,開發不需要關心,所以邏輯稍微簡單些


2.前景?

1.RN官方放棄,Flutter 官方宣停,Flutter也是Google ,同樣compose 和kmm也是google搞的,說明google 目前是把KMM放在第一梯隊的,極大成為后期的主力推薦,現在最新的Android Studio 創建的模版工程就是compose的,而且還支持iOS;
2.我的建立認知是KMM>Flutter>RN;kotlin的的語言優勢較大,和Java 無縫通用

hello word

下載最新的Android Studio,(具體是從哪個版本開始沒必要深糾,我的版本是Android Studio Giraffe | 2022.3.1)

?

?

List列表組建(LazyColum)

class LazyColumnActivity: ComponentActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContent {Surface(modifier = Modifier.fillMaxSize(),color = MaterialTheme.colorScheme.background) {MyLazyList()}}}@Composablefun MyLazyList(){val state= rememberLazyListState();LazyColumn(state=state){items(100){Text(text="item $it")}}}
}

?確實比寫Adapter,和CollectionViewDelegate簡單

Compose函數


"Jetpack Compose 是圍繞可組合函數構建的。這些函數可讓您以程序化方式定義應用的界面,只需描述應用界面的外觀并提供數據依賴項,而不必關注界面的構建過程(初始化元素、將其附加到父項等)。如需創建可組合函數,只需將 @Composable 注解添加到函數名稱中即可。" 官話

 @Composablefun MyText(){Text(text = "00000");return Text(text = "xfdft");}

上面這段代碼 執行結果顯示 兩個重疊的文字, 其實這個return 是無效的,內嵌的兩個text函數都會執行,@Composable函數的返回值是UNIT

 @Composablefun MyText():Int{Text(text = "00000FFF");return 1;}

這樣改造成返回值int 類型 在實際的結果中依舊是展示了這個text 也不報錯,這尼瑪就有點神奇了?

Kotlin 中間代碼(intermediate representation, IR),
這個是kotlin插件,是編譯時的,比較深奧,參考
?

預覽函數


基于xml的布局都提供預覽,Android layout ios storeboard 等,同樣compose 也具備這個特性

@Preview(name = "第一個預覽區域")@Composablefun preview(){Text(text="Hello,my name is jack,What's your name");}@Preview(name = "第二個預覽區域")@Composablefun preview2(){Text(text="停車坐愛楓林晚,窗前明月光");}

在android studio 的預覽區域就會顯示出來了,可以支持多個,但是在編輯的時候不是很流暢,官方還有很大的優化空間

Compose 組件清單大全

Text:用于顯示文本內容。
Image:用于顯示圖片。
Button:用于創建按鈕。
TextField:用于接收用戶輸入的文本。
Column:用于垂直排列多個組件。
Row:用于水平排列多個組件。
Box:用于在屏幕上創建一個矩形的區域。
Surface:用于繪制一塊可交互的區域。
Card:用于顯示一個卡片式的 UI 元素。
Divider:用于在 UI 中添加分隔線。

Spacer:間距組件

例子:結合行列間距來實現簡單的列表樣式

class LazyColumnActivity2: ComponentActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContent {Surface(modifier = Modifier.fillMaxSize(),color = MaterialTheme.colorScheme.background) {MyLazyList()}}}@Composablefun MyLazyList(){val state= rememberLazyListState();val items= listOf<Item>(Item("張三","我是中國的"),Item("李四","我是中國的"),Item("王武","我是中國的"))LazyColumn(state=state){items(items){MyItem(item = it)}}}@Composable@Previewfun MyItemPreview(){MyItem(item = Item("張三","我是中國的"))}@Composablefun MyItem(item:Item){return Row(modifier = Modifier.padding(10.dp)) {Image(painter = painterResource(id = R.drawable.ic_launcher_background), contentDescription ="這是頭顯",modifier = Modifier.size(40.dp).clip(CircleShape))Spacer(modifier = Modifier.width(8.dp))Column {Text(text = item.name);Spacer(modifier = Modifier.height(8.dp))Text(text = item.desc);}}}class Item(val name:String,val desc:String){}}

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/39157.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/39157.shtml
英文地址,請注明出處:http://en.pswp.cn/news/39157.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

kafka使用心得(一)

kafka入門 一種分布式的、基于發布/訂閱的消息系統&#xff0c;scala編寫&#xff0c;具備快速、可擴展、可持久化的特點。 基本概念 topic 主題 partition 分區&#xff0c;一個topic下可以有多個partition&#xff0c;消息是分散到多個partition里存儲的&#xff0c;part…

劍指Offer48.最長不含重復字符的子字符串 C++

1、題目描述 請從字符串中找出一個最長的不包含重復字符的子字符串&#xff0c;計算該最長子字符串的長度。 示例 1: 輸入: “abcabcbb” 輸出: 3 解釋: 因為無重復字符的最長子串是 “abc”&#xff0c;所以其長度為 3。 示例 2: 輸入: “bbbbb” 輸出: 1 解釋: 因為無重復字…

圖像處理技巧形態學濾波之膨脹操作

1. 引言 歡迎回來&#xff0c;我的圖像處理愛好者們&#xff01;今天&#xff0c;讓我們繼續研究圖像處理領域中的形態學計算。在本篇中&#xff0c;我們將重點介紹腐蝕操作的反向效果膨脹操作。 閑話少說&#xff0c;我們直接開始吧&#xff01; 2. 膨脹操作原理 膨脹操作…

macOS CLion 使用 bits/stdc++.h

macOS 下 CLion 使用 bits/stdc.h 頭文件 terminal運行 brew install gccCLion里配置 -D CMAKE_CXX_COMPILER/usr/local/bin/g-11

Visual Studio 2022 中解決使用scanf報錯的方法(一勞永逸)

目錄 【前言】 一、scanf報錯示例 二、解決使用scanf報錯的方法 解決方法1&#xff08;不推薦&#xff09; 解決方法2&#xff08;不推薦&#xff09; 解決方法3&#xff08;強烈推薦&#xff09; 第一步 第二步 第三步 三、效果演示&#xff08;方法三&#xff09; …

根據一棵樹的兩種遍歷構造二叉樹

題目 給定兩個整數數組 preorder 和 inorder &#xff0c;其中 preorder 是二叉樹的先序遍歷&#xff0c; inorder 是同一棵樹的中序遍歷&#xff0c;請構造二叉樹并返回其根節點。 示例 1: 輸入: preorder [3,9,20,15,7], inorder [9,3,15,20,7] 輸出: [3,9,20,null,null,…

Unity-Linux部署WebGL項目MIME類型添加

在以往的文章中有提到過使用IIS部署WebGL添加MIME類型使WebGL項目在瀏覽器中能夠正常加載&#xff0c;那么如果咱們做的是商業項目&#xff0c;往往是需要部署在學校或者云服務器上面的&#xff0c;大部分情況下如果項目有接口或者后臺管理系統&#xff0c;后臺基本都會使用Lin…

機器學習筆記:李宏毅ChatGPT Finetune VS Prompt

1 兩種大語言模型&#xff1a;GPT VS BERT 2 對于大語言模型的兩種不同期待 2.1 “專才” 2.1.1 成為專才的好處 Is ChatGPT A Good Translator? A Preliminary Study 2023 Arxiv 箭頭方向指的是從哪個方向往哪個方向翻譯 表格里面的數值越大表示翻譯的越好 可以發現專門做翻…

Ceph入門到精通-Linux下Ceph源碼編譯和GDB調試

Ceph版本&#xff1a;14.2.22 Linux版本&#xff1a;ubuntu-server 18.04 第一部分 下載Ceph源碼 1.1 配置Ceph源碼鏡像源 Ceph源碼是托管在Github上&#xff0c;由于某些原因&#xff0c;國內訪問Github網站很慢&#xff0c;所以需要從其他途徑加速獲取源碼。Github官方給出…

【ubuntu18.04】01-network-manager-all.yaml和interfaces和resolv.conf各有什么區別和聯系

文章目錄 01-network-manager-all.yaml、interfaces 和 resolv.conf 是與網絡配置相關的文件&#xff0c;它們在網絡設置中有著不同的作用和使用方式。 01-network-manager-all.yaml: 這是一個配置文件&#xff0c;通常在 Ubuntu 系統上使用 NetworkManager 進行網絡管理時使用…

ChatGPT?保密嗎?它有哪些潛在風險?如何規避?

自2022年11月公開發布以來&#xff0c;ChatGPT已成為許多企業和個人的必備工具&#xff0c;但隨著該技術越來越多地融入我們的日常生活&#xff0c;人們很自然地想知道&#xff1a;ChatGPT是否是保密的。 問&#xff1a;ChatGPT保密嗎&#xff1f; 答&#xff1a;否&#xff0…

C++11并發與多線程筆記(3)線程傳參詳解,detach()大坑,成員函數做線程函數

C11并發與多線程筆記&#xff08;3&#xff09;線程傳參詳解&#xff0c;detach 大坑&#xff0c;成員函數做線程函數 1、傳遞臨時對象作為線程參數1.1 要避免的陷阱11.2 要避免的陷阱21.3 總結 2、臨時對象作為線程參數2.1 線程id概念2.2 臨時對象構造時機抓捕 3、傳遞類對象…

VR時代真的到來了?

業界對蘋果的期待是&#xff0c;打造一臺真正顛覆性的&#xff0c;給頭顯設備奠定發展邏輯底座的產品&#xff0c;而實際上&#xff0c;蘋果只是發布了一臺更強大的頭顯。 大眾希望蘋果回答的問題是“我為什么需要一臺AR或者VR產品&#xff1f;”&#xff0c;但蘋果回答的是“…

從零開始學習 Java:簡單易懂的入門指南之MAth、System(十二)

常見API&#xff0c;MAth、System 1 Math類1.1 概述1.2 常見方法1.3 算法小題(質數)1.4 算法小題(自冪數) 2 System類2.1 概述2.2 常見方法 1 Math類 1.1 概述 tips&#xff1a;了解內容 查看API文檔&#xff0c;我們可以看到API文檔中關于Math類的定義如下&#xff1a; Math類…

每天一道leetcode:300. 最長遞增子序列(動態規劃中等)

今日份題目&#xff1a; 給你一個整數數組 nums &#xff0c;找到其中最長嚴格遞增子序列的長度。 子序列 是由數組派生而來的序列&#xff0c;刪除&#xff08;或不刪除&#xff09;數組中的元素而不改變其余元素的順序。例如&#xff0c;[3,6,2,7] 是數組 [0,3,1,6,2,2,7] …

【JavaEE進階】SpringBoot項目的創建

文章目錄 一. SpringBoot簡介1. 什么是SpringBoot?2. SpringBoot的優點 二. SpringBoot項目創建1. 使用IDEA創建2. 使用網頁創建SpringBoot項目 三. 運行SpringBoot項目 一. SpringBoot簡介 1. 什么是SpringBoot? Spring Boot 是一個用于快速構建基于 Spring 框架的應用程序…

Spring對象裝配

在spring中&#xff0c;Bean的執行流程為啟動spring容器&#xff0c;實例化bean&#xff0c;將bean注冊到spring容器中&#xff0c;將bean裝配到需要的類中。 既然我們需要將bea裝配到需要的類中&#xff0c;那么如何實現呢&#xff1f;這篇文章&#xff0c;將來闡述一下如何實…

SOFABoot——基本使用(筆記)

文章目錄 一、前言二、快速開始2.1 基本搭建2.2 測試是否成功2.3 其他部分日志測試異步啟動 三、SOFABoot的模塊化開發3.1 基于Spring上下文的隔離3.2 Root Application Context3.3 模塊并行化啟動3.4 JVM服務與RPC服務的發布與引用3.5 模塊配置Module-NameRequire-ModuleSprin…

wsl2安裝mysql環境

安裝完mysql后通過如下命令啟動mysql service mysql start 會顯示如下錯誤&#xff1a; mysql: unrecognized service 實際上上面顯示的錯誤是由于mysql沒有啟動成功造成的 我們要想辦法成功啟動mysql才可以 1.通過如下操作就可以跳過密碼直接進入mysql環境 2.如果想找到my…

微服務與Nacos概述-5

引入OpenFeign 添加依賴&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency><groupId>com.alibaba.cloud</groupId>…