• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 在NDK中保证多实例场景功能正常
2<!--Kit: ArkUI-->
3<!--Subsystem: ArkUI-->
4<!--Owner: @xiang-shouxing-->
5<!--Designer: @xiang-shouxing-->
6<!--Tester: @sally__-->
7<!--Adviser: @HelloCrease-->
8
9API version 20开始,ArkUI开发框架新增了[OH_ArkUI_RunTaskInScope](../reference/apis-arkui/capi-native-node-h.md#oh_arkui_runtaskinscope)接口,解决Native侧多实例场景下的组件操作问题。该功能通过动态切换执行上下文,确保跨实例组件属性设置的合法性,避免实例上下文不匹配导致的接口调用异常。
10
11在NDK多窗口开发时,可能会涉及到组件的跨实例设置属性等场景,使用该能力可确保在调用跨实例组件设置属性时的上下文正确性,避免跨实例接口调用失败。
12
13> **说明:**
14> - 适用于NDK多窗口开发中不同UI实例间的交互场景,例如在页面B中修改页面A创建的组件属性或未挂载到UI树的组件逻辑。
15>
16> - 支持通过userData参数传递自定义数据结构(如组件指针、业务参数等),便于在回调任务中精准定位目标组件。
17>
18> - 与[OH_ArkUI_NodeUtils_GetAttachedNodeHandleById](../reference/apis-arkui/capi-native-node-h.md#oh_arkui_nodeutils_getattachednodehandlebyid)等接口配合使用,有效规避跨实例访问导致的空指针或权限异常问题。
19
20
21本示例展示OH_ArkUI_RunTaskInScope接口的基础使用方式,OH_ArkUI_NodeUtils_GetAttachedNodeHandleById用于获取前置实例页面内的组件,相关使用请参考[OH_ArkUI_NodeUtils_GetAttachedNodeHandleById](../reference/apis-arkui/capi-native-node-h.md#oh_arkui_nodeutils_getattachednodehandlebyid),此处userData传入的数据类型为最终要设置的组件指针,便于设置对应组件属性。
22
23
24```c
25//page1
26ArkUI_NodeHandle button = nodeAPI->createNode(ARKUI_NODE_BUTTON);
27ArkUI_AttributeItem LABEL_Item = {.string = "pageOneButton"};
28//设置id,用于在第二个页面内通过接口查找
29ArkUI_AttributeItem id = {.string = "pageOneButton"};
30nodeAPI->setAttribute(button, NODE_ID, &id);
31nodeAPI->setAttribute(button, NODE_BUTTON_LABEL, &LABEL_Item);
32```
33
34```c
35//page2
36//pageOneButton由前置页面创建,通过OH_ArkUI_NodeUtils_GetAttachedNodeHandleById在第二个页面获取。
37ArkUI_NodeHandle pageOneButton = nullptr;
38auto ec = OH_ArkUI_NodeUtils_GetAttachedNodeHandleById("pageOneButton", &pageOneButton);
39auto uiContext = OH_ArkUI_GetContextByNode(pageOneButton);
40OH_ArkUI_RunTaskInScope(uiContext, pageOneButton, [](void *userData) {
41        auto *nodeAPI = reinterpret_cast<ArkUI_NativeNodeAPI_1 *>(
42            OH_ArkUI_QueryModuleInterfaceByName(ARKUI_NATIVE_NODE, "ArkUI_NativeNodeAPI_1"));
43        auto pageOneButton = (ArkUI_NodeHandle)userData;
44        ArkUI_NumberValue value[] = {480};
45        ArkUI_AttributeItem LABEL_Item = {.string = "success"};
46        value[0].f32 = 250;
47        ArkUI_AttributeItem button_Item = {value, sizeof(value) / sizeof(ArkUI_NumberValue)};
48        nodeAPI->setAttribute(pageOneButton, NODE_BUTTON_LABEL, &LABEL_Item);
49        nodeAPI->setAttribute(pageOneButton, NODE_WIDTH, &button_Item);
50    }
51);
52```