Compose之跨平台Activity页面

news/2025/2/22 15:29:29/

前言

Compose(Jetpack+jb)是可以跨平台的

目前跨平台主流的页面导航方式一般有两种

一种是都在同一个页面内进行页面替换类型的导航,类似于单Activity,多Fragment

另一种是不同的页面在不同的页面载体上,类似多Activity

两种页面导航方式都可以使用,但我比较偏向于使用多Activity的方案(见仁见智)

分析

拿Compose跨Android和Desktop来举例

Android的载体有Activity,Fragment,Compose fun

Desktop的载体有Window,Compose fun

我们可以使用Kotlin expect来关联Android的Activity和Desktop的Compose fun(或Window),写一个统一的类BaseComposeActivity

这样BaseComposeActivity在Android中就映射为一个真正的Activity,而在Desktop中映射为一个Compose fun,方便我们进行页面导航

正文

我们先写一个最简单的BaseComposeActivity出来,然后后面有需求我们在加东西

common:

/*** creator: lt  2021/4/27  lt.dygzs@qq.com* effect : 以Compose为根View的ba* warning:*/
expect abstract class BaseComposeActivity() {/*** compose根布局,我们页面的Compose视图都在这个函数内写*/@Composableactual abstract fun ComposeContent()
}

android:

actual abstract class BaseComposeActivity : AppCompatActivity() {@Composableactual abstract fun ComposeContent()override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContent {MyTheme {ComposeContent()}}}
}

desktop:

actual abstract class BaseComposeActivity {@Composableactual abstract fun ComposeContent()
}

这样我们一个基本的BaseComposeActivity就完成了,因为Android继承了AppCompatActivity类,所以可以直接通过Android的startActivity来启动,通过finish来销毁

而Desktop我们可以通过自定义一个页面栈,通过观察,添加,删除来管理页面:

将desktop的BaseComposeActivity改成这样:

actual abstract class BaseComposeActivity {@Composableactual abstract fun ComposeContent()actual fun mFinish() {//移除页面(可以改为remove(this))_activityStack.removeLast()}actual fun jump(clazz: Class<out BaseComposeActivity>) {//跳转页面,往栈中加入新页面//ps:这里可以做各种传参,生命周期或启动模式等的处理,此篇就不在赘述_activityStack.add(clazz.newInstance())}companion object {//自定义的任务栈,可以被Compose所观察val _activityStack = mutableStateListOf<BaseComposeActivity>(MainActivity())}
}

最后给Desktop的Application(main函数)添加BaseComposeActivity支持

fun main(vararg args: String) {//desktop的根应用application {//将所有页面放在一个Window中,也可以稍加修改改为每个BaseComposeActivity一个WindowWindow(onCloseRequest = ::exitApplication) {MyTheme {//页面内容BaseComposeActivity._activityStack.forEachIndexed { index, baseActivity ->//防止Compose生命周期变更导致的问题key(baseActivity) {Column(//使栈顶的Activity有宽高,其他页面没有宽高,这样就可以有覆盖的效果了if (index == 0)M.fillMaxSize().background(Color.White)elseM.size(0.dp)) {baseActivity.ComposeContent()}}}}}}
}

这样我们就封装好了一个跨平台的Activity

ps:后续出ios和web也可以类似如此的封装

我们可以直接在common中写Activity,比如:

class BannerActivity : BaseComposeActivity() {@Composableoverride fun ComposeContent() {val bannerState = rememberBannerState()Banner(colors.size,M.fillMaxSize(),bannerState = bannerState,autoScrollTime = 1000,orientation = Orientation.Vertical,) {}//jump<BannerActivity>()//finish()}}

desktop上的效果如下所示(Android和之前一样就不演示了): 

结语

当然跨平台的导航也可以使用单个页面内导航,可能对于Compose来说会更简单一点,但可能会少了一些灵活性

其实内部也可以将跨平台的toast和dialog封装到Activity中,如果你看懂了这篇文章,那对你来说应该也是很简单,下面的链接有示例

ps:完整代码可以参考(欢迎各位大佬star):ComposeViews(github)

如果大佬们有什么问题的话可以评论


http://www.ppmy.cn/news/21294.html

相关文章

二分查找核心思路--单调性--极值

在最初的二分查找中&#xff0c;我们将一组数据按大小排序&#xff0c;然后根据arr[mid]与要查找的k的大小比较&#xff0c;从而每次去掉一半的数字&#xff0c;使时间复杂度简化为O&#xff08;logN&#xff09;。 排序本质上是让数据的单调性统一&#xff0c;变为单增或单减…

字符串流stringstream--<sstream>

字符串流stringstream流详解 一.stringstream是C提供的一个字符串流&#xff0c;与iostream和fstream的操作方法类似&#xff0c;只是功能不同。要使用字符串流必须包含其头文件<sstream>。 #include<sstream> 二.stringstream字符串流通常用来做数据转换&#x…

Java多线程之CAS中的ABA问题与JUC的常见类

文章目录一. CAS指令与ABA问题1. 解析CAS2. 基于CAS实现的原子类3. 基于CAS实现自旋锁4. ABA问题二. JUC中的常见类1. Callable接口2. ReentrantLock类(可重入锁)3. Semaphore类(信号量)4. CountDownLatch同步工具类一. CAS指令与ABA问题 1. 解析CAS CAS即compare and awap, …

【整理五】

1.bind、call、apply 区别&#xff1f;如何实现一个bind&#xff1f; bind,call,apply三个方法都可以用来改变this的指向 call和apply调用后会立即执行,bind调用后不会立即执行而是返回一个改变this指向之后的一个函数call和bind的函数参数传递方式是(this绑定对象,参数1,参数…

【C++】入门(上)

本期博客给大家带来的全是干货&#xff0c;慢慢享用吧~C入门主要是一些对C语言不足的语法补充&#xff0c;废话不多说直接上干货&#xff1a;一、C的输出和输入1.1 输出在C上我们要想在屏幕&#xff08;控制台&#xff09;上进行一些内容的输出可以使用关键字&#xff1a;cout具…

MySQL中的多表联合查询

目录 一.介绍 数据准备 交叉连接查询 内连接查询 外连接 子查询 特点 子查询关键字 all关键字 any关键字和some关键字 in关键字 exists关键字 自关联查询 总结 一.介绍 多表查询就是同时查询两个或两个以上的表&#xff0c;因为有的时候用户在查看数据的时候,需要…

Linux搭建Hyperledger Fabric区块链框架 - Hyperledger Fabric 概念

企业选型的区块链底层技术 Hyperledger Fabric 概念 2015年&#xff0c;Linux基金会启动了Hyperledger项目&#xff0c;目标是发展跨行业的区块链技术。 Hyperledger Fabric是Hyperledger中的一个区块链项目&#xff0c;包含一个账本&#xff0c;使用智能合约并且是一个通过所…

R语言与数据分析—上(篇幅长,全)

内容过长但详细&#xff0c;分三篇写&#xff0c;总结分享也供日后参考回顾一、什么是R语言R是免费的&#xff0c;是一个全面的统计研究平台&#xff0c;提供了各式各样的数据分析技术&#xff0c;R拥有顶尖的绘图功能二、R语言优点和缺点优点1、有效的数据处理和保存机制2、拥…