1e41f4b71Sopenharmony_ci# PluginComponent (System API) 2e41f4b71Sopenharmony_ci 3e41f4b71Sopenharmony_ciThe **\<PluginComponent>** allows an application to display external UI from another application. To implement update through inter-process communication (IPC), see [@ohos.pluginComponent](../js-apis-plugincomponent.md). 4e41f4b71Sopenharmony_ci 5e41f4b71Sopenharmony_ci 6e41f4b71Sopenharmony_ci> **NOTE** 7e41f4b71Sopenharmony_ci> 8e41f4b71Sopenharmony_ci> - This component is supported since API version 9. Updates will be marked with a superscript to indicate their earliest API version. 9e41f4b71Sopenharmony_ci> 10e41f4b71Sopenharmony_ci> - The APIs provided by this module are system APIs. 11e41f4b71Sopenharmony_ci 12e41f4b71Sopenharmony_ci## Child Components 13e41f4b71Sopenharmony_ci 14e41f4b71Sopenharmony_ciNot supported 15e41f4b71Sopenharmony_ci 16e41f4b71Sopenharmony_ci 17e41f4b71Sopenharmony_ci## APIs 18e41f4b71Sopenharmony_ci 19e41f4b71Sopenharmony_ciPluginComponent(value: { template: PluginComponentTemplate, data: KVObject}) 20e41f4b71Sopenharmony_ci 21e41f4b71Sopenharmony_ciCreates a **PluginComponent** to display the UI provided by an external application. 22e41f4b71Sopenharmony_ci 23e41f4b71Sopenharmony_ci**Parameters** 24e41f4b71Sopenharmony_ci 25e41f4b71Sopenharmony_ci| Name| Type | Mandatory| Description | 26e41f4b71Sopenharmony_ci| ------ | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ | 27e41f4b71Sopenharmony_ci| value | {<br>template: [PluginComponentTemplate](#plugincomponenttemplate),<br>data: [KVObject](../js-apis-plugincomponent.md#kvobject)<br>} | Yes | **template**: template of the **PluginComponent**, which is bound to the component defined by the provider.<br>**data**: data passed to the **PluginComponent** provider.| 28e41f4b71Sopenharmony_ci 29e41f4b71Sopenharmony_ci## PluginComponentTemplate 30e41f4b71Sopenharmony_ci 31e41f4b71Sopenharmony_ci| Name | Type | Description | 32e41f4b71Sopenharmony_ci| ---------- | ------ | --------------------------- | 33e41f4b71Sopenharmony_ci| source | string | Component template name. | 34e41f4b71Sopenharmony_ci| bundleName | string | Bundle name of the provider ability.| 35e41f4b71Sopenharmony_ci## Attributes 36e41f4b71Sopenharmony_ciThe width and height of the component must be explicitly set to non-zero valid values. 37e41f4b71Sopenharmony_ci 38e41f4b71Sopenharmony_ci**NOTE** 39e41f4b71Sopenharmony_ci 40e41f4b71Sopenharmony_ci The template can be provided in either of the following modes: 41e41f4b71Sopenharmony_ci* Use an absolute path. In this case, set **source** to the absolute path of the template and leave **bundleName** blank. This mode is not recommended as it is applicable only to standalone templates that do not need to load resources. 42e41f4b71Sopenharmony_ci 43e41f4b71Sopenharmony_ci* Use an application package. In this case, set **bundleName** to the application bundle name and **source** to the relative path of the HAP file template. In the multi-HAP scenario, a HAP file is identified based on its relative path and name. 44e41f4b71Sopenharmony_ci 45e41f4b71Sopenharmony_ci Example: **{source: 'pages/PluginProviderExample.ets&entry', bundleName:'com.example.provider'}** 46e41f4b71Sopenharmony_ci 47e41f4b71Sopenharmony_ci The template is provided only when **source** can be set to an ability name in the FA model. 48e41f4b71Sopenharmony_ci 49e41f4b71Sopenharmony_ci Example: **{source:'plugin', bundleName:'com.example.provider'}** 50e41f4b71Sopenharmony_ci 51e41f4b71Sopenharmony_ci 52e41f4b71Sopenharmony_ci## Events 53e41f4b71Sopenharmony_ci 54e41f4b71Sopenharmony_ciOnly the [gesture event](ts-gesture-settings.md) can be distributed to and processed inside the provider page. 55e41f4b71Sopenharmony_ci 56e41f4b71Sopenharmony_ciIn addition to the [universal events](ts-universal-events-click.md), the following events are supported. 57e41f4b71Sopenharmony_ci 58e41f4b71Sopenharmony_ci### onComplete 59e41f4b71Sopenharmony_ci 60e41f4b71Sopenharmony_cionComplete(callback: () => void) 61e41f4b71Sopenharmony_ci 62e41f4b71Sopenharmony_ciTriggered when the component loading is complete. 63e41f4b71Sopenharmony_ci 64e41f4b71Sopenharmony_ci**System API**: This is a system API. 65e41f4b71Sopenharmony_ci 66e41f4b71Sopenharmony_ci**System capability**: SystemCapability.ArkUI.ArkUI.Full 67e41f4b71Sopenharmony_ci 68e41f4b71Sopenharmony_ci### onError 69e41f4b71Sopenharmony_ci 70e41f4b71Sopenharmony_cionError(callback: (info: { errcode: number, msg: string }) => void) 71e41f4b71Sopenharmony_ci 72e41f4b71Sopenharmony_ciTriggered when an error occurs during component loading. 73e41f4b71Sopenharmony_ci 74e41f4b71Sopenharmony_ci**System API**: This is a system API. 75e41f4b71Sopenharmony_ci 76e41f4b71Sopenharmony_ci**System capability**: SystemCapability.ArkUI.ArkUI.Full 77e41f4b71Sopenharmony_ci 78e41f4b71Sopenharmony_ci**Parameters** 79e41f4b71Sopenharmony_ci 80e41f4b71Sopenharmony_ci| Name| Type | Mandatory| Description | 81e41f4b71Sopenharmony_ci| ------ | ------------------------------------------------------------ | ---- | ----------------------------------------------- | 82e41f4b71Sopenharmony_ci| info | { errcode: number, msg: string } | Yes | **errcode**: error code.<br>**msg**: error information.| 83e41f4b71Sopenharmony_ci 84e41f4b71Sopenharmony_ci## Example 85e41f4b71Sopenharmony_ci 86e41f4b71Sopenharmony_ci 87e41f4b71Sopenharmony_ci### PluginComponent User 88e41f4b71Sopenharmony_ci 89e41f4b71Sopenharmony_ci```ts 90e41f4b71Sopenharmony_ci//PluginUserExample.ets 91e41f4b71Sopenharmony_ciimport plugin from "./plugin_component" 92e41f4b71Sopenharmony_ciinterface Info{ 93e41f4b71Sopenharmony_ci errcode:number, 94e41f4b71Sopenharmony_ci msg:string 95e41f4b71Sopenharmony_ci} 96e41f4b71Sopenharmony_ci@Entry 97e41f4b71Sopenharmony_ci@Component 98e41f4b71Sopenharmony_cistruct PluginUserExample { 99e41f4b71Sopenharmony_ci 100e41f4b71Sopenharmony_ci build() { 101e41f4b71Sopenharmony_ci Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { 102e41f4b71Sopenharmony_ci Text('Hello World') 103e41f4b71Sopenharmony_ci .fontSize(50) 104e41f4b71Sopenharmony_ci .fontWeight(FontWeight.Bold) 105e41f4b71Sopenharmony_ci Button('Register Request Listener') 106e41f4b71Sopenharmony_ci .fontSize(30) 107e41f4b71Sopenharmony_ci .width(400) 108e41f4b71Sopenharmony_ci .height(100) 109e41f4b71Sopenharmony_ci .margin({top:20}) 110e41f4b71Sopenharmony_ci .onClick(()=>{ 111e41f4b71Sopenharmony_ci plugin.onListener() 112e41f4b71Sopenharmony_ci console.log("Button('Register Request Listener')") 113e41f4b71Sopenharmony_ci }) 114e41f4b71Sopenharmony_ci Button('Request') 115e41f4b71Sopenharmony_ci .fontSize(50) 116e41f4b71Sopenharmony_ci .width(400) 117e41f4b71Sopenharmony_ci .height(100) 118e41f4b71Sopenharmony_ci .margin({ top: 20 }) 119e41f4b71Sopenharmony_ci .onClick(() => { 120e41f4b71Sopenharmony_ci plugin.Request() 121e41f4b71Sopenharmony_ci console.log("Button('Request')") 122e41f4b71Sopenharmony_ci }) 123e41f4b71Sopenharmony_ci PluginComponent({ 124e41f4b71Sopenharmony_ci template: { source: 'pages/PluginProviderExample.ets&entry', bundleName: 'com.example.plugin' }, 125e41f4b71Sopenharmony_ci data: { 'countDownStartValue': 'new countDownStartValue' } 126e41f4b71Sopenharmony_ci }).size({ width: 500, height: 350 }) 127e41f4b71Sopenharmony_ci .onComplete(() => { 128e41f4b71Sopenharmony_ci console.log("onComplete") 129e41f4b71Sopenharmony_ci }) 130e41f4b71Sopenharmony_ci .onError((info:Info) => { 131e41f4b71Sopenharmony_ci console.log("onComplete" + info.errcode + ":" + info.msg) 132e41f4b71Sopenharmony_ci }) 133e41f4b71Sopenharmony_ci } 134e41f4b71Sopenharmony_ci .width('100%') 135e41f4b71Sopenharmony_ci .height('100%') 136e41f4b71Sopenharmony_ci } 137e41f4b71Sopenharmony_ci} 138e41f4b71Sopenharmony_ci``` 139e41f4b71Sopenharmony_ci 140e41f4b71Sopenharmony_ci### PluginComponent Provider 141e41f4b71Sopenharmony_ci 142e41f4b71Sopenharmony_ci```ts 143e41f4b71Sopenharmony_ci//PluginProviderExample.ets 144e41f4b71Sopenharmony_ciimport plugin from "./plugin_component" 145e41f4b71Sopenharmony_ci 146e41f4b71Sopenharmony_ci@Entry 147e41f4b71Sopenharmony_ci@Component 148e41f4b71Sopenharmony_cistruct PluginProviderExample { 149e41f4b71Sopenharmony_ci @State message: string = 'no click!' 150e41f4b71Sopenharmony_ci 151e41f4b71Sopenharmony_ci build() { 152e41f4b71Sopenharmony_ci Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { 153e41f4b71Sopenharmony_ci Button('Register Push Listener') 154e41f4b71Sopenharmony_ci .fontSize(30) 155e41f4b71Sopenharmony_ci .width(400) 156e41f4b71Sopenharmony_ci .height(100) 157e41f4b71Sopenharmony_ci .margin({top:20}) 158e41f4b71Sopenharmony_ci .onClick(()=>{ 159e41f4b71Sopenharmony_ci plugin.onListener() 160e41f4b71Sopenharmony_ci console.log("Button('Register Push Listener')") 161e41f4b71Sopenharmony_ci }) 162e41f4b71Sopenharmony_ci Button('Push') 163e41f4b71Sopenharmony_ci .fontSize(30) 164e41f4b71Sopenharmony_ci .width(400) 165e41f4b71Sopenharmony_ci .height(100) 166e41f4b71Sopenharmony_ci .margin({top:20}) 167e41f4b71Sopenharmony_ci .onClick(()=>{ 168e41f4b71Sopenharmony_ci plugin.Push() 169e41f4b71Sopenharmony_ci this.message = "Button('Push')" 170e41f4b71Sopenharmony_ci console.log("Button('Push')") 171e41f4b71Sopenharmony_ci }) 172e41f4b71Sopenharmony_ci Text(this.message) 173e41f4b71Sopenharmony_ci .height(150) 174e41f4b71Sopenharmony_ci .fontSize(30) 175e41f4b71Sopenharmony_ci .padding(5) 176e41f4b71Sopenharmony_ci .margin(5) 177e41f4b71Sopenharmony_ci }.width('100%').height('100%').backgroundColor(0xDCDCDC).padding({ top: 5 }) 178e41f4b71Sopenharmony_ci } 179e41f4b71Sopenharmony_ci} 180e41f4b71Sopenharmony_ci``` 181e41f4b71Sopenharmony_ci 182e41f4b71Sopenharmony_ci### PluginComponent Tools 183e41f4b71Sopenharmony_ci 184e41f4b71Sopenharmony_ci#### FA Model 185e41f4b71Sopenharmony_ci```js 186e41f4b71Sopenharmony_ci// The sample code applies only to JS source files. 187e41f4b71Sopenharmony_ci//plugin_component.js 188e41f4b71Sopenharmony_ciimport pluginComponentManager from '@ohos.pluginComponent' 189e41f4b71Sopenharmony_ci 190e41f4b71Sopenharmony_cifunction onPushListener(source, template, data, extraData) { 191e41f4b71Sopenharmony_ci console.log("onPushListener template.source=" + template.source) 192e41f4b71Sopenharmony_ci console.log("onPushListener template.ability=" + template.ability) 193e41f4b71Sopenharmony_ci console.log("onPushListener data=" + JSON.stringify(data)) 194e41f4b71Sopenharmony_ci console.log("onPushListener extraData=" + JSON.stringify(extraData)) 195e41f4b71Sopenharmony_ci} 196e41f4b71Sopenharmony_ci 197e41f4b71Sopenharmony_cifunction onRequestListener(source, name, data) 198e41f4b71Sopenharmony_ci{ 199e41f4b71Sopenharmony_ci console.log("onRequestListener name=" + name); 200e41f4b71Sopenharmony_ci console.log("onRequestListener data=" + JSON.stringify(data)); 201e41f4b71Sopenharmony_ci return {template:"plugintemplate", data:data}; 202e41f4b71Sopenharmony_ci} 203e41f4b71Sopenharmony_ci 204e41f4b71Sopenharmony_ciexport default { 205e41f4b71Sopenharmony_ci //register listener 206e41f4b71Sopenharmony_ci onListener() { 207e41f4b71Sopenharmony_ci pluginComponentManager.on("push", onPushListener) 208e41f4b71Sopenharmony_ci pluginComponentManager.on("request", onRequestListener) 209e41f4b71Sopenharmony_ci }, 210e41f4b71Sopenharmony_ci Push() { 211e41f4b71Sopenharmony_ci // The component provider proactively sends data. 212e41f4b71Sopenharmony_ci pluginComponentManager.push( 213e41f4b71Sopenharmony_ci { 214e41f4b71Sopenharmony_ci want: { 215e41f4b71Sopenharmony_ci bundleName: "com.example.plugin", 216e41f4b71Sopenharmony_ci abilityName: "com.example.myapplication.PluginProviderExample", 217e41f4b71Sopenharmony_ci }, 218e41f4b71Sopenharmony_ci name: "PluginProviderExample", 219e41f4b71Sopenharmony_ci data: { 220e41f4b71Sopenharmony_ci "key_1": "plugin component test", 221e41f4b71Sopenharmony_ci "key_2": 34234 222e41f4b71Sopenharmony_ci }, 223e41f4b71Sopenharmony_ci extraData: { 224e41f4b71Sopenharmony_ci "extra_str": "this is push event" 225e41f4b71Sopenharmony_ci }, 226e41f4b71Sopenharmony_ci jsonPath: "", 227e41f4b71Sopenharmony_ci }, 228e41f4b71Sopenharmony_ci (err, data) => { 229e41f4b71Sopenharmony_ci console.log("push_callback: push ok!"); 230e41f4b71Sopenharmony_ci } 231e41f4b71Sopenharmony_ci ) 232e41f4b71Sopenharmony_ci }, 233e41f4b71Sopenharmony_ci Request() { 234e41f4b71Sopenharmony_ci // The component user proactively sends data. 235e41f4b71Sopenharmony_ci pluginComponentManager.request({ 236e41f4b71Sopenharmony_ci want: { 237e41f4b71Sopenharmony_ci bundleName: "com.example.plugin", 238e41f4b71Sopenharmony_ci abilityName: "com.example.myapplication.PluginProviderExample", 239e41f4b71Sopenharmony_ci }, 240e41f4b71Sopenharmony_ci name: "PluginProviderExample", 241e41f4b71Sopenharmony_ci data: { 242e41f4b71Sopenharmony_ci "key_1": "plugin component test", 243e41f4b71Sopenharmony_ci "key_2": 34234 244e41f4b71Sopenharmony_ci }, 245e41f4b71Sopenharmony_ci jsonPath: "", 246e41f4b71Sopenharmony_ci }, 247e41f4b71Sopenharmony_ci (err, data) => { 248e41f4b71Sopenharmony_ci console.log("request_callback: componentTemplate.ability=" + data.componentTemplate.ability) 249e41f4b71Sopenharmony_ci console.log("request_callback: componentTemplate.source=" + data.componentTemplate.source) 250e41f4b71Sopenharmony_ci console.log("request_callback: data=" + JSON.stringify(data.data)) 251e41f4b71Sopenharmony_ci console.log("request_callback: extraData=" + JSON.stringify(data.extraData)) 252e41f4b71Sopenharmony_ci } 253e41f4b71Sopenharmony_ci ) 254e41f4b71Sopenharmony_ci } 255e41f4b71Sopenharmony_ci} 256e41f4b71Sopenharmony_ci``` 257e41f4b71Sopenharmony_ci 258e41f4b71Sopenharmony_ci#### Stage Model 259e41f4b71Sopenharmony_ci```js 260e41f4b71Sopenharmony_ci// The sample code applies only to JS source files. 261e41f4b71Sopenharmony_ci//plugin_component.js 262e41f4b71Sopenharmony_ciimport pluginComponentManager from '@ohos.pluginComponent' 263e41f4b71Sopenharmony_ci 264e41f4b71Sopenharmony_cifunction onPushListener(source, template, data, extraData) { 265e41f4b71Sopenharmony_ci console.log("onPushListener template.source=" + template.source) 266e41f4b71Sopenharmony_ci console.log("onPushListener template.ability=" + template.ability) 267e41f4b71Sopenharmony_ci console.log("onPushListener data=" + JSON.stringify(data)) 268e41f4b71Sopenharmony_ci console.log("onPushListener extraData=" + JSON.stringify(extraData)) 269e41f4b71Sopenharmony_ci} 270e41f4b71Sopenharmony_ci 271e41f4b71Sopenharmony_cifunction onRequestListener(source, name, data) 272e41f4b71Sopenharmony_ci{ 273e41f4b71Sopenharmony_ci console.log("onRequestListener name=" + name); 274e41f4b71Sopenharmony_ci console.log("onRequestListener data=" + JSON.stringify(data)); 275e41f4b71Sopenharmony_ci return {template:"plugintemplate", data:data}; 276e41f4b71Sopenharmony_ci} 277e41f4b71Sopenharmony_ci 278e41f4b71Sopenharmony_ciexport default { 279e41f4b71Sopenharmony_ci //register listener 280e41f4b71Sopenharmony_ci onListener() { 281e41f4b71Sopenharmony_ci pluginComponentManager.on("push", onPushListener) 282e41f4b71Sopenharmony_ci pluginComponentManager.on("request", onRequestListener) 283e41f4b71Sopenharmony_ci }, 284e41f4b71Sopenharmony_ci Push() { 285e41f4b71Sopenharmony_ci // The component provider proactively sends data. 286e41f4b71Sopenharmony_ci pluginComponentManager.push( 287e41f4b71Sopenharmony_ci { 288e41f4b71Sopenharmony_ci owner: { 289e41f4b71Sopenharmony_ci bundleName: "com.example.myapplication", 290e41f4b71Sopenharmony_ci abilityName: "com.example.myapplication.MainAbility", 291e41f4b71Sopenharmony_ci }, 292e41f4b71Sopenharmony_ci target: { 293e41f4b71Sopenharmony_ci bundleName: "com.example.plugin", 294e41f4b71Sopenharmony_ci abilityName: "com.example.myapplication.PluginProviderExample", 295e41f4b71Sopenharmony_ci }, 296e41f4b71Sopenharmony_ci name: "PluginProviderExample", 297e41f4b71Sopenharmony_ci data: { 298e41f4b71Sopenharmony_ci "key_1": "plugin component test", 299e41f4b71Sopenharmony_ci "key_2": 34234 300e41f4b71Sopenharmony_ci }, 301e41f4b71Sopenharmony_ci extraData: { 302e41f4b71Sopenharmony_ci "extra_str": "this is push event" 303e41f4b71Sopenharmony_ci }, 304e41f4b71Sopenharmony_ci jsonPath: "", 305e41f4b71Sopenharmony_ci }, 306e41f4b71Sopenharmony_ci (err, data) => { 307e41f4b71Sopenharmony_ci console.log("push_callback: push ok!"); 308e41f4b71Sopenharmony_ci } 309e41f4b71Sopenharmony_ci ) 310e41f4b71Sopenharmony_ci }, 311e41f4b71Sopenharmony_ci Request() { 312e41f4b71Sopenharmony_ci // The component user proactively sends data. 313e41f4b71Sopenharmony_ci pluginComponentManager.request({ 314e41f4b71Sopenharmony_ci owner: { 315e41f4b71Sopenharmony_ci bundleName: "com.example.myapplication", 316e41f4b71Sopenharmony_ci abilityName: "com.example.myapplication.MainAbility", 317e41f4b71Sopenharmony_ci }, 318e41f4b71Sopenharmony_ci target: { 319e41f4b71Sopenharmony_ci bundleName: "com.example.plugin", 320e41f4b71Sopenharmony_ci abilityName: "com.example.myapplication.PluginProviderExample", 321e41f4b71Sopenharmony_ci }, 322e41f4b71Sopenharmony_ci name: "PluginProviderExample", 323e41f4b71Sopenharmony_ci data: { 324e41f4b71Sopenharmony_ci "key_1": "plugin component test", 325e41f4b71Sopenharmony_ci "key_2": 34234 326e41f4b71Sopenharmony_ci }, 327e41f4b71Sopenharmony_ci jsonPath: "", 328e41f4b71Sopenharmony_ci }, 329e41f4b71Sopenharmony_ci (err, data) => { 330e41f4b71Sopenharmony_ci console.log("request_callback: componentTemplate.ability=" + data.componentTemplate.ability) 331e41f4b71Sopenharmony_ci console.log("request_callback: componentTemplate.source=" + data.componentTemplate.source) 332e41f4b71Sopenharmony_ci console.log("request_callback: data=" + JSON.stringify(data.data)) 333e41f4b71Sopenharmony_ci console.log("request_callback: extraData=" + JSON.stringify(data.extraData)) 334e41f4b71Sopenharmony_ci } 335e41f4b71Sopenharmony_ci ) 336e41f4b71Sopenharmony_ci } 337e41f4b71Sopenharmony_ci} 338e41f4b71Sopenharmony_ci``` 339