import com.m8test.script.GlobalVariables.*
fun side1Run() {
// 创建一个 ComposeView, 可以通过声明式ui创建脚本界面
_composeView.create {
// 插槽(Slot)是一种内容分发机制。它允许你在封装一个通用组件时,在组件内部预留一些“坑位”或“插槽”,然后让使用该组件的父组件来决定这些“坑位”里到底填充什么内容。
// 创建一个Column,Column是一种垂直布局,可以让其中的组件垂直排列
Column {
// 设置 Column 中 content 插槽的内容
setContent {
// 1. 创建一个可变状态,用于保存计数器的值
val count = mutableStateOf(0)
// 添加一个文件组件到 Column (垂直布局)中
Text {
// 2. 在组件的某个属性中使用该状态的值
setText(count.getValue().toString())
// 3. 将状态添加到组件中,这样text组件就会监听该状态的改变,这个是必须的步骤,如果没有此步骤,那么 count 的值改变时,composable(text组件)不会重组(界面更新)
trackSingleState(count)
DisposableEffect {
// 当 count 的值改变时会重新执行附带效应
setKeys(_iterables.mutableListOf(count) as List<com.m8test.script.core.api.ui.compose.state.MutableState<Any?>>)
// 这个日志只会打印一次
_console.log("config disposable effect count: ", count.getValue())
setEffect {
// 这里才是附带效应的代码,下面这个代码会在 Text 进入组合或者 count 值改变时执行
_console.log("disposable effect enter or count value change: ", count.getValue())
setOnDispose {
// 这里才是附带效应的代码,下面这个代码会在 Text 退出组合或者 count 值改变时执行
_console.log("disposable effect leave or count value change: ", count.getValue())
}
}
}
DisposableEffect {
// 这个日志只会打印一次
_console.log("config disposable effect without keys")
setEffect {
// 这里才是附带效应的代码,下面这个代码会在 Text 进入组合时执行
_console.log("disposable effect enter without keys")
setOnDispose {
// 这里才是附带效应的代码,下面这个代码会在 Text 退出组合时执行
_console.log("disposable effect leave without keys")
}
}
}
}
// 添加一个文本按钮到 Column (垂直布局)中
TextButton {
// 设置文本按钮的content插槽内容
setContent {
// 在插槽中添加一个文本
Text {
setText("点击我")
}
}
// 设置按钮点击事件
setOnClick {
// 4. 当按钮被点击时,更新状态的值,这时使用到count的所有组件都会重组(界面更新), 必须要 trackSingleState
count.setValue(count.getValue() + 1)
}
}
}
}
}
// 启动一个Activity用于显示脚本界面
_activity.start()
}
//-m8test-remove side1Run();
// 创建一个 ComposeView, 可以通过声明式ui创建脚本界面
$composeView.create { slot ->
// 插槽(Slot)是一种内容分发机制。它允许你在封装一个通用组件时,在组件内部预留一些“坑位”或“插槽”,然后让使用该组件的父组件来决定这些“坑位”里到底填充什么内容。
// 创建一个Column,Column是一种垂直布局,可以让其中的组件垂直排列
slot.Column { column ->
// 设置 Column 中 content 插槽的内容
column.setContent { columnSlot ->
// 1. 创建一个可变状态,用于保存计数器的值
def count = slot.mutableStateOf(0)
// 添加一个文件组件到 Column (垂直布局)中
columnSlot.Text { text ->
// 2. 在组件的某个属性中使用该状态的值
text.setText(count.getValue().toString())
// 3. 将状态添加到组件中,这样text组件就会监听该状态的改变,这个是必须的步骤,如果没有此步骤,那么 count 的值改变时,composable(text组件)不会重组(界面更新)
text.trackSingleState(count)
text.DisposableEffect { effect ->
// 当 count 的值改变时会重新执行附带效应
effect.setKeys($iterables.mutableListOf(count))
// 这个日志只会打印一次
$console.log("config disposable effect count: ", count.getValue())
effect.setEffect {
// 这里才是附带效应的代码,下面这个代码会在 Text 进入组合或者 count 值改变时执行
$console.log("disposable effect enter or count value change: ", count.getValue())
it.setOnDispose {
// 这里才是附带效应的代码,下面这个代码会在 Text 退出组合或者 count 值改变时执行
$console.log("disposable effect leave or count value change: ", count.getValue())
}
}
}
text.DisposableEffect { effect ->
// 这个日志只会打印一次
$console.log("config disposable effect without keys")
effect.setEffect {
// 这里才是附带效应的代码,下面这个代码会在 Text 进入组合时执行
$console.log("disposable effect enter without keys")
it.setOnDispose {
// 这里才是附带效应的代码,下面这个代码会在 Text 退出组合时执行
$console.log("disposable effect leave without keys")
}
}
}
}
// 添加一个文本按钮到 Column (垂直布局)中
columnSlot.TextButton { button ->
// 设置文本按钮的content插槽内容
button.setContent { buttonSlot ->
// 在插槽中添加一个文本
buttonSlot.Text { text ->
text.setText("点击我")
}
}
// 设置按钮点击事件
button.setOnClick {
// 4. 当按钮被点击时,更新状态的值,这时使用到count的所有组件都会重组(界面更新), 必须要 trackSingleState
count.setValue(count.getValue() + 1)
}
}
}
}
}
// 启动一个Activity用于显示脚本界面
$activity.start()
// 创建一个 ComposeView, 可以通过声明式ui创建脚本界面
$composeView.create(slot => {
// 插槽(Slot)是一种内容分发机制。它允许你在封装一个通用组件时,在组件内部预留一些“坑位”或“插槽”,然后让使用该组件的父组件来决定这些“坑位”里到底填充什么内容。
// 创建一个Column,Column是一种垂直布局,可以让其中的组件垂直排列
slot.Column(column => {
// 设置 Column 中 content 插槽的内容
column.setContent(columnSlot => {
// 1. 创建一个可变状态,用于保存计数器的值
const count = slot.mutableStateOf(0);
// 添加一个文件组件到 Column (垂直布局)中
columnSlot.Text(text => {
// 2. 在组件的某个属性中使用该状态的值
text.setText(count.getValue().toString());
// 3. 将状态添加到组件中,这样text组件就会监听该状态的改变,这个是必须的步骤,如果没有此步骤,那么 count 的值改变时,composable(text组件)不会重组(界面更新)
text.trackSingleState(count);
text.DisposableEffect(effect => {
// 当 count 的值改变时会重新执行附带效应
effect.setKeys([count]);
// 这个日志只会打印一次
$console.log("config disposable effect count: ", count.getValue());
effect.setEffect(it => {
// 这里才是附带效应的代码,下面这个代码会在 Text 进入组合或者 count 值改变时执行
$console.log("disposable effect enter or count value change: ", count.getValue());
it.setOnDispose(() => {
// 这里才是附带效应的代码,下面这个代码会在 Text 退出组合或者 count 值改变时执行
$console.log("disposable effect leave or count value change: ", count.getValue());
});
});
});
text.DisposableEffect(effect => {
// 这个日志只会打印一次
$console.log("config disposable effect without keys");
effect.setEffect(it => {
// 这里才是附带效应的代码,下面这个代码会在 Text 进入组合时执行
$console.log("disposable effect enter without keys");
it.setOnDispose(() => {
// 这里才是附带效应的代码,下面这个代码会在 Text 退出组合时执行
$console.log("disposable effect leave without keys");
});
});
});
});
// 添加一个文本按钮到 Column (垂直布局)中
columnSlot.TextButton(button => {
// 设置文本按钮的content插槽内容
button.setContent(buttonSlot => {
// 在插槽中添加一个文本
buttonSlot.Text(text => {
text.setText("点击我");
});
});
// 设置按钮点击事件
button.setOnClick(() => {
// 4. 当按钮被点击时,更新状态的值,这时使用到count的所有组件都会重组(界面更新), 必须要 trackSingleState
count.setValue(count.getValue() + 1);
});
});
});
});
});
// 启动一个Activity用于显示脚本界面
$activity.start();
-- 创建一个 ComposeView, 可以通过声明式ui创建脚本界面
_composeView:create(function(slot)
-- 插槽(Slot)是一种内容分发机制。它允许你在封装一个通用组件时,在组件内部预留一些“坑位”或“插槽”,然后让使用该组件的父组件来决定这些“坑位”里到底填充什么内容。
-- 创建一个Column,Column是一种垂直布局,可以让其中的组件垂直排列
slot:Column(function(column)
-- 设置 Column 中 content 插槽的内容
column:setContent(function(columnSlot)
-- 1. 创建一个可变状态,用于保存计数器的值
local count = slot:mutableStateOf(0)
-- 添加一个文件组件到 Column (垂直布局)中
columnSlot:Text(function(text)
-- 2. 在组件的某个属性中使用该状态的值
text:setText(tostring(count:getValue()))
-- 3. 将状态添加到组件中,这样text组件就会监听该状态的改变,这个是必须的步骤,如果没有此步骤,那么 count 的值改变时,composable(text组件)不会重组(界面更新)
text:trackSingleState(count)
text:DisposableEffect(function(effect)
-- 当 count 的值改变时会重新执行附带效应
effect:setKeys(_iterables:mutableListOf(count))
-- 这个日志只会打印一次
_console:log("config disposable effect count: ", count:getValue())
effect:setEffect(function(it)
-- 这里才是附带效应的代码,下面这个代码会在 Text 进入组合或者 count 值改变时执行
_console:log("disposable effect enter or count value change: ", count:getValue())
it:setOnDispose(function()
-- 这里才是附带效应的代码,下面这个代码会在 Text 退出组合或者 count 值改变时执行
_console:log("disposable effect leave or count value change: ", count:getValue())
end)
end)
end)
text:DisposableEffect(function(effect)
-- 这个日志只会打印一次
_console:log("config disposable effect without keys")
effect:setEffect(function(it)
-- 这里才是附带效应的代码,下面这个代码会在 Text 进入组合时执行
_console:log("disposable effect enter without keys")
it:setOnDispose(function()
-- 这里才是附带效应的代码,下面这个代码会在 Text 退出组合时执行
_console:log("disposable effect leave without keys")
end)
end)
end)
end)
-- 添加一个文本按钮到 Column (垂直布局)中
columnSlot:TextButton(function(button)
-- 设置文本按钮的content插槽内容
button:setContent(function(buttonSlot)
-- 在插槽中添加一个文本
buttonSlot:Text(function(text)
text:setText("点击我")
end)
end)
-- 设置按钮点击事件
button:setOnClick(function()
-- 4. 当按钮被点击时,更新状态的值,这时使用到count的所有组件都会重组(界面更新), 必须要 trackSingleState
count:setValue(count:getValue() + 1)
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\console\Console $console */
global $console;
/** @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) {
// 1. 创建一个可变状态,用于保存计数器的值
$count = $slot->mutableStateOf(0);
// 添加一个文件组件到 Column (垂直布局)中
$columnSlot->Text(function ($text) use ($count) {
// 2. 在组件的某个属性中使用该状态的值
$text->setText((string)$count->getValue());
// 3. 将状态添加到组件中,这样text组件就会监听该状态的改变,这个是必须的步骤,如果没有此步骤,那么 count 的值改变时,composable(text组件)不会重组(界面更新)
$text->trackSingleState($count);
$text->DisposableEffect(function ($effect) use ($count) {
global $iterables, $console;
// 当 count 的值改变时会重新执行附带效应
$effect->setKeys($iterables->mutableListOf($count));
// 这个日志只会打印一次
$console->log(javaString("config disposable effect count: "), $count->getValue());
$effect->setEffect(function ($it) use ($count) {
global $console;
// 这里才是附带效应的代码,下面这个代码会在 Text 进入组合或者 count 值改变时执行
$console->log(javaString("disposable effect enter or count value change: "), $count->getValue());
$it->setOnDispose(function () use ($count) {
global $console;
// 这里才是附带效应的代码,下面这个代码会在 Text 退出组合或者 count 值改变时执行
$console->log(javaString("disposable effect leave or count value change: "), $count->getValue());
});
});
});
$text->DisposableEffect(function ($effect) {
global $console;
// 这个日志只会打印一次
$console->log(javaString("config disposable effect without keys"));
$effect->setEffect(function ($it) {
global $console;
// 这里才是附带效应的代码,下面这个代码会在 Text 进入组合时执行
$console->log(javaString("disposable effect enter without keys"));
$it->setOnDispose(function () {
global $console;
// 这里才是附带效应的代码,下面这个代码会在 Text 退出组合时执行
$console->log(javaString("disposable effect leave without keys"));
});
});
});
});
// 添加一个文本按钮到 Column (垂直布局)中
$columnSlot->TextButton(function ($button) use ($count) {
// 设置文本按钮的content插槽内容
$button->setContent(function ($buttonSlot) {
// 在插槽中添加一个文本
$buttonSlot->Text(function ($text) {
$text->setText(javaString("点击我"));
});
});
// 设置按钮点击事件
$button->setOnClick(function () use ($count) {
// 4. 当按钮被点击时,更新状态的值,这时使用到count的所有组件都会重组(界面更新), 必须要 trackSingleState
$count->setValue($count->getValue() + 1);
});
});
});
});
});
// 启动一个Activity用于显示脚本界面
$activity->start();
# 导入全局变量,$console -> _console
from m8test_java.com.m8test.script.GlobalVariables import _console
# 导入全局变量,$composeView -> _composeView
from m8test_java.com.m8test.script.GlobalVariables import _composeView
# 导入全局变量,$activity -> _activity
from m8test_java.com.m8test.script.GlobalVariables import _activity
# 导入全局变量,$iterables -> _iterables
from m8test_java.com.m8test.script.GlobalVariables import _iterables
# 创建一个 ComposeView, 可以通过声明式ui创建脚本界面
_composeView.create(lambda slot:
# 插槽(Slot)是一种内容分发机制。它允许你在封装一个通用组件时,在组件内部预留一些“坑位”或“插槽”,然后让使用该组件的父组件来决定这些“坑位”里到底填充什么内容。
# 创建一个Column,Column是一种垂直布局,可以让其中的组件垂直排列
slot.Column(lambda column:
# 设置 Column 中 content 插槽的内容
# 使用元组和海象表达式来在lambda中执行多个语句
column.setContent(lambda columnSlot: (
# 1. 创建一个可变状态,用于保存计数器的值
(count := slot.mutableStateOf(0)),
# 添加一个文件组件到 Column (垂直布局)中
columnSlot.Text(lambda text: (
# 2. 在组件的某个属性中使用该状态的值
text.setText(str(count.getValue())),
# 3. 将状态添加到组件中,这样text组件就会监听该状态的改变,这个是必须的步骤,如果没有此步骤,那么 count 的值改变时,composable(text组件)不会重组(界面更新)
text.trackSingleState(count),
text.DisposableEffect(lambda effect: (
# 当 count 的值改变时会重新执行附带效应
effect.setKeys(_iterables.mutableListOf(count)),
# 这个日志只会打印一次
_console.log("config disposable effect count: ", count.getValue()),
effect.setEffect(lambda disposable_scope: (
# 这里才是附带效应的代码,下面这个代码会在 Text 进入组合或者 count 值改变时执行
_console.log("disposable effect enter or count value change: ", count.getValue()),
disposable_scope.setOnDispose(lambda:
# 这里才是附带效应的代码,下面这个代码会在 Text 退出组合或者 count 值改变时执行
_console.log("disposable effect leave or count value change: ", count.getValue())
)
))
)),
text.DisposableEffect(lambda effect: (
# 这个日志只会打印一次
_console.log("config disposable effect without keys"),
effect.setEffect(lambda disposable_scope: (
# 这里才是附带效应的代码,下面这个代码会在 Text 进入组合时执行
_console.log("disposable effect enter without keys"),
disposable_scope.setOnDispose(lambda:
# 这里才是附带效应的代码,下面这个代码会在 Text 退出组合时执行
_console.log("disposable effect leave without keys")
)
))
))
)),
# 添加一个文本按钮到 Column (垂直布局)中
columnSlot.TextButton(lambda button: (
# 设置文本按钮的content插槽内容
button.setContent(lambda buttonSlot:
# 在插槽中添加一个文本
buttonSlot.Text(lambda text:
text.setText("点击我")
)
),
# 设置按钮点击事件
button.setOnClick(lambda:
# 4. 当按钮被点击时,更新状态的值,这时使用到count的所有组件都会重组(界面更新), 必须要 trackSingleState
count.setValue(count.getValue() + 1)
)
))
))
)
)
# 启动一个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|
# 1. 创建一个可变状态,用于保存计数器的值
count = slot.mutableStateOf(0)
# 添加一个文件组件到 Column (垂直布局)中
columnSlot.Text do |text|
# 2. 在组件的某个属性中使用该状态的值
text.setText(count.getValue().to_s)
# 3. 将状态添加到组件中,这样text组件就会监听该状态的改变,这个是必须的步骤,如果没有此步骤,那么 count 的值改变时,composable(text组件)不会重组(界面更新)
text.trackSingleState(count)
text.DisposableEffect do |effect|
# 当 count 的值改变时会重新执行附带效应
effect.setKeys($iterables.mutableListOf(count))
# 这个日志只会打印一次
$console.log("config disposable effect count: ", count.getValue())
# 在 Groovy 中 implicit 'it' 指代闭包参数,在 Ruby 中需要显式声明 |it|
effect.setEffect do |it|
# 这里才是附带效应的代码,下面这个代码会在 Text 进入组合或者 count 值改变时执行
$console.log("disposable effect enter or count value change: ", count.getValue())
it.setOnDispose do
# 这里才是附带效应的代码,下面这个代码会在 Text 退出组合或者 count 值改变时执行
$console.log("disposable effect leave or count value change: ", count.getValue())
end
end
end
text.DisposableEffect do |effect|
# 这个日志只会打印一次
$console.log("config disposable effect without keys")
effect.setEffect do |it|
# 这里才是附带效应的代码,下面这个代码会在 Text 进入组合时执行
$console.log("disposable effect enter without keys")
it.setOnDispose do
# 这里才是附带效应的代码,下面这个代码会在 Text 退出组合时执行
$console.log("disposable effect leave without keys")
end
end
end
end
# 添加一个文本按钮到 Column (垂直布局)中
columnSlot.TextButton do |button|
# 设置文本按钮的content插槽内容
button.setContent do |buttonSlot|
# 在插槽中添加一个文本
buttonSlot.Text do |text|
text.setText("点击我")
end
end
# 设置按钮点击事件
button.setOnClick do
# 4. 当按钮被点击时,更新状态的值,这时使用到count的所有组件都会重组(界面更新), 必须要 trackSingleState
count.setValue(count.getValue() + 1)
end
end
end
end
end
# 启动一个Activity用于显示脚本界面
$activity.start()