import com.m8test.script.GlobalVariables.*
fun side1Run() {
// 创建一个 ComposeView, 可以通过声明式ui创建脚本界面
_composeView.create {
// 插槽(Slot)是一种内容分发机制。它允许你在封装一个通用组件时,在组件内部预留一些“坑位”或“插槽”,然后让使用该组件的父组件来决定这些“坑位”里到底填充什么内容。
// 创建一个Column,Column是一种垂直布局,可以让其中的组件垂直排列
Column {
// 设置 Column 中 content 插槽的内容
setContent {
val state = mutableStateOf("InitValue")
// 1. 创建 CompositionLocal 和 StaticCompositionLocal
val localTestComposition = getCompositionLocals().compositionLocalOf("LocalTest") { state }
val localTestStaticComposition = getCompositionLocals().staticCompositionLocalOf("LocalTestStatic") { state }
CompositionLocalProvider {
// 2. 通过 CompositionLocalProvider 为 CompositionLocal 提供值
setValues(_iterables.listOf(localTestComposition.provides(state)))
setContent {
// 在插槽中添加一个文本
Text {
// 3. 消费值
setText(getCompositionLocalValue(localTestComposition)!!.getValue())
}
// 在插槽中添加一个文本
Text {
// 由于这个没有用到 CompositionLocal 的值,所以就算状态发生改变也不会重组, providerSlot 中用到 CompositionLocal 的值的 Composable 才会重组
setText("非静态${state.getValue()}")
}
}
}
CompositionLocalProvider {
// 2. 通过 CompositionLocalProvider 为 CompositionLocal 提供值
setValues(_iterables.listOf(localTestStaticComposition.provides(state)))
setContent {
// 在插槽中添加一个文本
Text {
// 3. 消费值
setText(getCompositionLocalValue(localTestStaticComposition)!!.getValue())
}
// 在插槽中添加一个文本
Text {
// 即使这个没有用到 CompositionLocal 的值但因为其使用了静态的 CompositionLocal,所以状态发生改变会重组, 因为整个 providerSlot 中的 Composable 都会重组
setText("静态${state.getValue()}")
}
}
}
// 添加一个按钮,这个按钮点击后会改变 state 的值
Button {
setContent {
Text {
setText("点击我")
}
}
// 改变状态值
setOnClick {
state.setValue(state.getValue() + ".")
}
}
}
}
}
// 启动一个Activity用于显示脚本界面
_activity.start()
}
//-m8test-remove side1Run();
// 创建一个 ComposeView, 可以通过声明式ui创建脚本界面
$composeView.create { slot ->
// 插槽(Slot)是一种内容分发机制。它允许你在封装一个通用组件时,在组件内部预留一些“坑位”或“插槽”,然后让使用该组件的父组件来决定这些“坑位”里到底填充什么内容。
// 创建一个Column,Column是一种垂直布局,可以让其中的组件垂直排列
slot.Column { column ->
// 设置 Column 中 content 插槽的内容
column.setContent { columnSlot ->
def state = columnSlot.mutableStateOf("InitValue")
// 1. 创建 CompositionLocal 和 StaticCompositionLocal
def localTestComposition = columnSlot.getCompositionLocals().compositionLocalOf("LocalTest") { state }
def localTestStaticComposition = columnSlot.getCompositionLocals().staticCompositionLocalOf("LocalTestStatic") { state }
columnSlot.CompositionLocalProvider { provider ->
// 2. 通过 CompositionLocalProvider 为 CompositionLocal 提供值
provider.setValues($iterables.listOf(localTestComposition.provides(state)))
provider.setContent { providerSlot ->
// 在插槽中添加一个文本
providerSlot.Text { text ->
// 3. 消费值
text.setText(text.getCompositionLocalValue(localTestComposition).getValue())
}
// 在插槽中添加一个文本
providerSlot.Text { text ->
// 由于这个没有用到 CompositionLocal 的值,所以就算状态发生改变也不会重组, providerSlot 中用到 CompositionLocal 的值的 Composable 才会重组
text.setText("非静态" + state.getValue())
}
}
}
columnSlot.CompositionLocalProvider { provider ->
// 2. 通过 CompositionLocalProvider 为 CompositionLocal 提供值
provider.setValues($iterables.listOf(localTestStaticComposition.provides(state)))
provider.setContent { providerSlot ->
// 在插槽中添加一个文本
providerSlot.Text { text ->
// 3. 消费值
text.setText(text.getCompositionLocalValue(localTestStaticComposition).getValue())
}
// 在插槽中添加一个文本
providerSlot.Text { text ->
// 即使这个没有用到 CompositionLocal 的值但因为其使用了静态的 CompositionLocal,所以状态发生改变会重组, 因为整个 providerSlot 中的 Composable 都会重组
text.setText("静态" + state.getValue())
}
}
}
// 添加一个按钮,这个按钮点击后会改变 state 的值
columnSlot.Button { button ->
button.setContent { bs ->
bs.Text {
it.setText("点击我")
}
}
// 改变状态值
button.setOnClick {
state.setValue(state.getValue() + ".")
}
}
}
}
}
// 启动一个Activity用于显示脚本界面
$activity.start()
// 创建一个 ComposeView, 可以通过声明式ui创建脚本界面
$composeView.create(slot => {
// 插槽(Slot)是一种内容分发机制。它允许你在封装一个通用组件时,在组件内部预留一些“坑位”或“插槽”,然后让使用该组件的父组件来决定这些“坑位”里到底填充什么内容。
// 创建一个Column,Column是一种垂直布局,可以让其中的组件垂直排列
slot.Column(column => {
// 设置 Column 中 content 插槽的内容
column.setContent(columnSlot => {
const state = columnSlot.mutableStateOf("InitValue");
// 1. 创建 CompositionLocal 和 StaticCompositionLocal
const localTestComposition = columnSlot.getCompositionLocals().compositionLocalOf("LocalTest", () => state);
const localTestStaticComposition = columnSlot.getCompositionLocals().staticCompositionLocalOf("LocalTestStatic", () => state);
columnSlot.CompositionLocalProvider(provider => {
// 2. 通过 CompositionLocalProvider 为 CompositionLocal 提供值
provider.setValues($iterables.listOf(localTestComposition.provides(state)));
provider.setContent(providerSlot => {
// 在插槽中添加一个文本
providerSlot.Text(text => {
// 3. 消费值
text.setText(text.getCompositionLocalValue(localTestComposition).getValue());
});
// 在插槽中添加一个文本
providerSlot.Text(text => {
// 由于这个没有用到 CompositionLocal 的值,所以就算状态发生改变也不会重组, providerSlot 中用到 CompositionLocal 的值的 Composable 才会重组
text.setText("非静态" + state.getValue());
});
});
});
columnSlot.CompositionLocalProvider(provider => {
// 2. 通过 CompositionLocalProvider 为 CompositionLocal 提供值
provider.setValues($iterables.listOf(localTestStaticComposition.provides(state)));
provider.setContent(providerSlot => {
// 在插槽中添加一个文本
providerSlot.Text(text => {
// 3. 消费值
text.setText(text.getCompositionLocalValue(localTestStaticComposition).getValue());
});
// 在插槽中添加一个文本
providerSlot.Text(text => {
// 即使这个没有用到 CompositionLocal 的值但因为其使用了静态的 CompositionLocal,所以状态发生改变会重组, 因为整个 providerSlot 中的 Composable 都会重组
text.setText("静态" + state.getValue());
});
});
});
// 添加一个按钮,这个按钮点击后会改变 state 的值
columnSlot.Button(button => {
button.setContent(bs => {
bs.Text(it => {
it.setText("点击我");
});
});
// 改变状态值
button.setOnClick(() => {
state.setValue(state.getValue() + ".");
});
});
});
});
});
// 启动一个Activity用于显示脚本界面
$activity.start();
-- 创建一个 ComposeView, 可以通过声明式ui创建脚本界面
_composeView:create(function(slot)
-- 插槽(Slot)是一种内容分发机制。它允许你在封装一个通用组件时,在组件内部预留一些“坑位”或“插槽”,然后让使用该组件的父组件来决定这些“坑位”里到底填充什么内容。
-- 创建一个Column,Column是一种垂直布局,可以让其中的组件垂直排列
slot:Column(function(column)
-- 设置 Column 中 content 插槽的内容
column:setContent(function(columnSlot)
local state = columnSlot:mutableStateOf("InitValue")
-- 1. 创建 CompositionLocal 和 StaticCompositionLocal
local localTestComposition = columnSlot:getCompositionLocals():compositionLocalOf("LocalTest", function() return state end)
local localTestStaticComposition = columnSlot:getCompositionLocals():staticCompositionLocalOf("LocalTestStatic", function() return state end)
columnSlot:CompositionLocalProvider(function(provider)
-- 2. 通过 CompositionLocalProvider 为 CompositionLocal 提供值
provider:setValues(_iterables:listOf(localTestComposition:provides(state)))
provider:setContent(function(providerSlot)
-- 在插槽中添加一个文本
providerSlot:Text(function(text)
-- 3. 消费值
text:setText(tostring(text:getCompositionLocalValue(localTestComposition):getValue()))
end)
-- 在插槽中添加一个文本
providerSlot:Text(function(text)
-- 由于这个没有用到 CompositionLocal 的值,所以就算状态发生改变也不会重组, providerSlot 中用到 CompositionLocal 的值的 Composable 才会重组
text:setText("非静态" .. tostring(state:getValue()))
end)
end)
end)
columnSlot:CompositionLocalProvider(function(provider)
-- 2. 通过 CompositionLocalProvider 为 CompositionLocal 提供值
provider:setValues(_iterables:listOf(localTestStaticComposition:provides(state)))
provider:setContent(function(providerSlot)
-- 在插槽中添加一个文本
providerSlot:Text(function(text)
-- 3. 消费值
text:setText(tostring(text:getCompositionLocalValue(localTestStaticComposition):getValue()))
end)
-- 在插槽中添加一个文本
providerSlot:Text(function(text)
-- 即使这个没有用到 CompositionLocal 的值但因为其使用了静态的 CompositionLocal,所以状态发生改变会重组, 因为整个 providerSlot 中的 Composable 都会重组
text:setText("静态" .. tostring(state:getValue()))
end)
end)
end)
-- 添加一个按钮,这个按钮点击后会改变 state 的值
columnSlot:Button(function(button)
button:setContent(function(bs)
bs:Text(function(it)
it:setText("点击我")
end)
end)
-- 改变状态值
button:setOnClick(function()
state:setValue(tostring(state:getValue()) .. ".")
end)
end)
end)
end)
end)
-- 启动一个Activity用于显示脚本界面
_activity:start()
<?php
/** @var m8test_java\com\m8test\script\core\api\ui\compose\ComposeView $composeView */
global $composeView;
/** @var m8test_java\com\m8test\script\core\api\ui\Activity $activity */
global $activity;
/** @var m8test_java\com\m8test\script\core\api\collections\Iterables $iterables */
global $iterables;
// 创建一个 ComposeView, 可以通过声明式ui创建脚本界面
$composeView->create(function ($slot) {
// 插槽(Slot)是一种内容分发机制。它允许你在封装一个通用组件时,在组件内部预留一些“坑位”或“插槽”,然后让使用该组件的父组件来决定这些“坑位”里到底填充什么内容。
// 创建一个Column,Column是一种垂直布局,可以让其中的组件垂直排列
$slot->Column(function ($column) use ($slot) {
// 设置 Column 中 content 插槽的内容
$column->setContent(function ($columnSlot) use ($slot) {
global $iterables;
$state = $columnSlot->mutableStateOf(javaString("InitValue"));
// 1. 创建 CompositionLocal 和 StaticCompositionLocal
$localTestComposition = $columnSlot->getCompositionLocals()->compositionLocalOf(javaString("LocalTest"), function () use ($state) {
return $state;
});
$localTestStaticComposition = $columnSlot->getCompositionLocals()->staticCompositionLocalOf(javaString("LocalTestStatic"), function () use ($state) {
return $state;
});
$columnSlot->CompositionLocalProvider(function ($provider) use ($localTestComposition, $state) {
global $iterables;
// 2. 通过 CompositionLocalProvider 为 CompositionLocal 提供值
$provider->setValues($iterables->listOf($localTestComposition->provides($state)));
$provider->setContent(function ($providerSlot) use ($localTestComposition, $state) {
// 在插槽中添加一个文本
$providerSlot->Text(function ($text) use ($localTestComposition) {
// 3. 消费值
$text->setText($text->getCompositionLocalValue($localTestComposition)->getValue());
});
// 在插槽中添加一个文本
$providerSlot->Text(function ($text) use ($state) {
// 由于这个没有用到 CompositionLocal 的值,所以就算状态发生改变也不会重组, providerSlot 中用到 CompositionLocal 的值的 Composable 才会重组
$text->setText(javaString("非静态") . $state->getValue());
});
});
});
$columnSlot->CompositionLocalProvider(function ($provider) use ($localTestStaticComposition, $state) {
global $iterables;
// 2. 通过 CompositionLocalProvider 为 CompositionLocal 提供值
$provider->setValues($iterables->listOf($localTestStaticComposition->provides($state)));
$provider->setContent(function ($providerSlot) use ($localTestStaticComposition, $state) {
// 在插槽中添加一个文本
$providerSlot->Text(function ($text) use ($localTestStaticComposition) {
// 3. 消费值
$text->setText($text->getCompositionLocalValue($localTestStaticComposition)->getValue());
});
// 在插槽中添加一个文本
$providerSlot->Text(function ($text) use ($state) {
// 即使这个没有用到 CompositionLocal 的值但因为其使用了静态的 CompositionLocal,所以状态发生改变会重组, 因为整个 providerSlot 中的 Composable 都会重组
$text->setText(javaString("静态") . $state->getValue());
});
});
});
// 添加一个按钮,这个按钮点击后会改变 state 的值
$columnSlot->Button(function ($button) use ($state) {
$button->setContent(function ($bs) {
$bs->Text(function ($it) {
$it->setText(javaString("点击我"));
});
});
// 改变状态值
$button->setOnClick(function () use ($state) {
$state->setValue($state->getValue() . javaString("."));
});
});
});
});
});
// 启动一个Activity用于显示脚本界面
$activity->start();
from m8test_java.com.m8test.script.GlobalVariables import _activity
from m8test_java.com.m8test.script.GlobalVariables import _composeView
from m8test_java.com.m8test.script.GlobalVariables import _iterables
# 创建一个 ComposeView, 可以通过声明式ui创建脚本界面
_composeView.create(lambda slot: (
# 插槽(Slot)是一种内容分发机制。它允许你在封装一个通用组件时,在组件内部预留一些“坑位”或“插槽”,然后让使用该组件的父组件来决定这些“坑位”里到底填充什么内容。
# 创建一个Column,Column是一种垂直布局,可以让其中的组件垂直排列
slot.Column(lambda column: (
# 设置 Column 中 content 插槽的内容
column.setContent(lambda columnSlot: (
# 使用海象表达式定义 state
(state := columnSlot.mutableStateOf("InitValue")),
# 1. 创建 CompositionLocal 和 StaticCompositionLocal
# Groovy 的 { state } 转换为 lambda: state
(localTestComposition := columnSlot.getCompositionLocals().compositionLocalOf("LocalTest", lambda: state)),
(localTestStaticComposition := columnSlot.getCompositionLocals().staticCompositionLocalOf("LocalTestStatic",
lambda: state)),
columnSlot.CompositionLocalProvider(lambda provider: (
# 2. 通过 CompositionLocalProvider 为 CompositionLocal 提供值
provider.setValues(_iterables.listOf(localTestComposition.provides(state))),
provider.setContent(lambda providerSlot: (
# 在插槽中添加一个文本
providerSlot.Text(lambda text: (
# 3. 消费值
text.setText(text.getCompositionLocalValue(localTestComposition).getValue())
)),
# 在插槽中添加一个文本
providerSlot.Text(lambda text: (
# 由于这个没有用到 CompositionLocal 的值,所以就算状态发生改变也不会重组, providerSlot 中用到 CompositionLocal 的值的 Composable 才会重组
text.setText("非静态" + state.getValue())
))
))
)),
columnSlot.CompositionLocalProvider(lambda provider: (
# 2. 通过 CompositionLocalProvider 为 CompositionLocal 提供值
provider.setValues(_iterables.listOf(localTestStaticComposition.provides(state))),
provider.setContent(lambda providerSlot: (
# 在插槽中添加一个文本
providerSlot.Text(lambda text: (
# 3. 消费值
text.setText(text.getCompositionLocalValue(localTestStaticComposition).getValue())
)),
# 在插槽中添加一个文本
providerSlot.Text(lambda text: (
# 即使这个没有用到 CompositionLocal 的值但因为其使用了静态的 CompositionLocal,所以状态发生改变会重组, 因为整个 providerSlot 中的 Composable 都会重组
text.setText("静态" + state.getValue())
))
))
)),
# 添加一个按钮,这个按钮点击后会改变 state 的值
columnSlot.Button(lambda button: (
button.setContent(lambda bs: (
bs.Text(lambda it: (
it.setText("点击我")
))
)),
# 改变状态值
# setOnClick 通常是一个无参闭包
button.setOnClick(lambda: (
state.setValue(state.getValue() + ".")
))
))
))
))
))
# 启动一个Activity用于显示脚本界面
_activity.start()
# encoding: utf-8
# 创建一个 ComposeView, 可以通过声明式ui创建脚本界面
$composeView.create do |slot|
# 插槽(Slot)是一种内容分发机制。它允许你在封装一个通用组件时,在组件内部预留一些“坑位”或“插槽”,然后让使用该组件的父组件来决定这些“坑位”里到底填充什么内容。
# 创建一个Column,Column是一种垂直布局,可以让其中的组件垂直排列
slot.Column do |column|
# 设置 Column 中 content 插槽的内容
column.setContent do |columnSlot|
state = columnSlot.mutableStateOf("InitValue")
# 1. 创建 CompositionLocal 和 StaticCompositionLocal
localTestComposition = columnSlot.getCompositionLocals().compositionLocalOf("LocalTest") { state }
localTestStaticComposition = columnSlot.getCompositionLocals().staticCompositionLocalOf("LocalTestStatic") { state }
columnSlot.CompositionLocalProvider do |provider|
# 2. 通过 CompositionLocalProvider 为 CompositionLocal 提供值
provider.setValues($iterables.listOf(localTestComposition.provides(state)))
provider.setContent do |providerSlot|
# 在插槽中添加一个文本
providerSlot.Text do |text|
# 3. 消费值
text.setText(text.getCompositionLocalValue(localTestComposition).getValue())
end
# 在插槽中添加一个文本
providerSlot.Text do |text|
# 由于这个没有用到 CompositionLocal 的值,所以就算状态发生改变也不会重组, providerSlot 中用到 CompositionLocal 的值的 Composable 才会重组
text.setText("非静态" + state.getValue().to_s)
end
end
end
columnSlot.CompositionLocalProvider do |provider|
# 2. 通过 CompositionLocalProvider 为 CompositionLocal 提供值
provider.setValues($iterables.listOf(localTestStaticComposition.provides(state)))
provider.setContent do |providerSlot|
# 在插槽中添加一个文本
providerSlot.Text do |text|
# 3. 消费值
text.setText(text.getCompositionLocalValue(localTestStaticComposition).getValue())
end
# 在插槽中添加一个文本
providerSlot.Text do |text|
# 即使这个没有用到 CompositionLocal 的值但因为其使用了静态的 CompositionLocal,所以状态发生改变会重组, 因为整个 providerSlot 中的 Composable 都会重组
text.setText("静态" + state.getValue().to_s)
end
end
end
# 添加一个按钮,这个按钮点击后会改变 state 的值
columnSlot.Button do |button|
button.setContent do |bs|
bs.Text do |it|
it.setText("点击我")
end
end
# 改变状态值
button.setOnClick do
state.setValue(state.getValue() + ".")
end
end
end
end
end
# 启动一个Activity用于显示脚本界面
$activity.start()