本库是跨平台库,可以运行在android,linux,window等平台。
理论上也支持mac,ios等平台,也写了相关代码,但我没有mac,ios等设备,因此就将相关依赖注释起来了,没有为其构建并测试打包。 如果你希望支持mac,ios等平台,可以将相关gradle中的注释放开进行构建和测试。
由于本库是跨平台库,因此,相关依赖会与android版本
有所差别,并内置了datastore读写实现。
因此若是仅为android平台构建应用,也可以使用
android版本 专为android平台维护,支持datastore,sharedpreference,mmkv等。
implementation("com.github.Knightwood.ComposePreferenceMultiplatform:preference-ui-compose-multi-android:1.0.0")
implementation("com.github.Knightwood.ComposePreferenceMultiplatform:preference-ui-compose-multi-desktop:1.0.0")
implementation("com.github.Knightwood.ComposePreferenceMultiplatform:preference-ui-compose-multi:1.0.0")
- 一些破坏性改动
- 方法名 getReadWriteTool 改为 getSingleDataEditor
- 接口名 IPreferenceReadWrite 改为 IPreferenceEditor
首先点击run/debug configurations
步骤:
-
点击添加,选择gradle,在run的输入框中写入
desktopRun -DmainClass=MainKt --quiet
-
gradle project 选择 ComposePreference-Multi:composeApp
直接在run/debug configurations下拉框中选择composeApp,点击run
本库与android版使用同一个读写接口,因此,在使用跨平台android依赖时,也可以依赖android版中的mmkv和sharedpreference读写工具。
- 手动生成DataStore文件,获取DataStorePreferenceHolder
//android
val dataStore = getDataStore(applicationContext,"ee.preferences_pb")
//desktop
val dataStore = getDataStore("/home/kiylxf/桌面/新建文件夹/ee.preferences_pb")
//获取holder
val holder = DataStorePreferenceHolder.instance(dataStore)
- 构建preference页面 构建preference页面等功能与android版 相同
PreferencesScope(holder = holder) {
val customNodeName = "customNode"
//创建一个自定义节点
val node = holder.registerDependence(customNodeName, true)
PreferencesCautionCard(title = "PreferencesCautionCard")
PreferencesHintCard(title = "PreferencesHintCard")
PreferenceItemLargeTitle(title = "PreferenceItem大标题")
PreferenceItem(
title = "普通的PreferenceItem",
description = "可以带图标",
icon = Icons.Filled.Favorite,
endIcon = Icons.Filled.Share
)
PreferenceItem(
title = "绝大多数可带图标",
icon = Icons.Filled.Edit,
endIcon = Icons.Filled.Share
)
PreferenceItemVariant(
title = "PreferenceItem变种",
icon = Icons.Filled.AccountCircle,
endIcon = Icons.Filled.Share,
description = "但是用起来无差别,但是用起来无差别,但是用起来无差别,但是用起来无差别,但是用起来无差别,但是用起来无差别"
)
HorizontalDivider()
PreferenceItemSubTitle(title = "编辑框Preference")
OutlinedEditTextPreference(
title = "outlined编辑框", keyName = "edit11",
defaultValue = "默认文本",
icon = Icons.Filled.AccountCircle,
)
FilledEditTextPreference(
defaultValue = "默认文本",
title = "Filled编辑框",
keyName = "edit12",
icon = Icons.Filled.AccountCircle,
changed = {
}
)
HorizontalDivider()
PreferenceItemSubTitle(title = "PreferenceItemSubTitle")
PreferenceSwitch(
keyName = "bol2",
title = "启用下面全部",
dependenceKey = DependenceNode.rootName,//指定依赖为根结点,这样自身就不会受到影响
description = "关闭开关以禁用下面内容",
) {
node.enableStateFlow.tryEmit(it)
}
PreferenceCollapseBox(
title = "可折叠菜单",
description = "preference描述",
dependenceKey = customNodeName,
) {
PreferenceSwitch(
keyName = "bol",
title = "title",
dependenceKey = DependenceNode.rootName,//指定依赖为根结点,这样自身就不会受到影响
description = "description",
icon = Icons.Filled.AccountCircle
) { state ->
//这里获取并修改了当前的enable状态,
//依赖这个节点的会改变显示状态,
//如果当前没有指定依赖,自身也会受到影响
holder.getDependence("bol")?.let {
it.enableStateFlow.tryEmit(state)
}
}
//依赖keyName为bol的PreferenceSwitch的state
PreferenceSwitch(
keyName = "bol3",
title = "title",
dependenceKey = "bol",
description = "description",
icon = Icons.Filled.Face
)
}
PreferenceListMenu(
title = "list菜单",
keyName = "PreferenceListMenu",
description = "list菜单介绍",
dependenceKey = customNodeName,
list = listOf(
MenuEntity(
leadingIcon = Icons.Outlined.Edit,
text = "edit",
labelKey = 0
),
MenuEntity(
leadingIcon = Icons.Outlined.Settings,
text = "Settings",
labelKey = 1
),
MenuDivider,
MenuEntity(
leadingIcon = Icons.Outlined.Email,
text = "Send Feedback",
labelKey = 2
),
)
) {
println( "menu item labelKey: $it")
}
HorizontalDivider()
PreferenceItemSubTitle(
title = "各种switch",
dependenceKey = customNodeName,
)
PreferenceSwitchWithContainer(
keyName = "bol4",
title = "带Container的Switch",
description = "描述,描述,描述,描述,描述",
dependenceKey = customNodeName,
icon = null
)
PreferenceSwitch(
keyName = "www",
title = "夜间模式",
dependenceKey = customNodeName,//指定依赖为根结点,这样自身就不会受到影响
description = "开关描述",
) {
println( "FirstPage: $it")
// isDarkFlow.tryEmit(it)
}
PreferenceSwitchWithDivider(
keyName = "bol5",
title = "前部可点击switch",
dependenceKey = customNodeName,
description = "description",
icon = Icons.Filled.Face
)
HorizontalDivider()
PreferenceItemSubTitle(
title = "RadioGroup",
dependenceKey = customNodeName,
)
PreferenceRadioGroup(
keyName = "radioGroup",
dependenceKey = customNodeName,
labelPairs = listOf(
"first" to 3,
"second" to 1
), changed = {
println( "radio: ${it}")
}
)
HorizontalDivider()
PreferenceItemSubTitle(
title = "CheckBoxGroup",
dependenceKey = customNodeName,
)
PreferenceCheckBoxGroup(
keyName = "CheckBoxGroup",
dependenceKey = customNodeName,
labels = listOf(
"first",
"second"
), changed = {
println("checkbox: ${it.joinToString(",")}")
}
)
HorizontalDivider()
PreferenceItemSubTitle(
title = "PreferenceSlider",
dependenceKey = customNodeName,
)
PreferenceSlider(
keyName = "slider",
dependenceKey = customNodeName, //依赖key为customNode的状态
min = 0f,
max = 10f, steps = 9, defaultValue = 0f, changed = {
println("slider: $it")
}
)
}