提交 8a2b87b1 编写于 作者: H Haoming Luo

修改'导出HSP内资源'部分

Signed-off-by: NHaoming Luo <mzfslhm@163.com>
上级 9973592f
...@@ -82,12 +82,20 @@ export { MyTitleBar } from './components/MyTitleBar' ...@@ -82,12 +82,20 @@ export { MyTitleBar } from './components/MyTitleBar'
``` ```
#### 通过$r访问HSP中资源 #### 通过$r访问HSP中资源
注意,在`HSP`中,通过`$r`/`$rawfile`可以使用本模块`resources`目录下的资源。 在组件中,经常需要使用到字符串、颜色值、图片等资源。`HSP`中的组件同样需要使用资源,我们一般将其使用的资源放在HSP包内,以符合高内聚低耦合的原则,同时使得多处调用时资源可以只维持一个拷贝。若要使用到HSP中资源,可以像以上代码一样,通过`$r`/`$rawfile`可以使用本模块`resources`目录下的资源。
如果使用相对路径的方式,例如:
不推荐使用相对路径的方式,容易引用错误路径。例如:
`HSP`模块中使用`Image("common/example.png")`,实际上该`Image`组件访问的是`HSP调用方`(如`entry`)下的资源`entry/src/main/ets/common/example.png` `HSP`模块中使用`Image("common/example.png")`,实际上该`Image`组件访问的是`HSP调用方`(如`entry`)下的资源`entry/src/main/ets/common/example.png`
### 导出HSP中资源 ### 导出HSP中资源
封装对外提供资源的接口类: HSP内资源有时也需要在外部其它包中直接调用,这时可以使用一个类来提供对外导出资源的接口,该方案的好处是:
- HSP开发者可以控制自己需要导出的资源,不需要对外暴露的资源可以不用导出
- 使用方无须感知HSP内部的资源名称,HSP内部的资源名称变化时也不需要使用方跟着修改
其具体实现如下:
封装对外提供资源的接口类:
注:用`$r`方法返回的是Resource对象形式的资源,可以被组件直接使用,但在一般场景下要对其进行解封装才能直接使用,这时需要另写函数获取解封装后资源。
```ts ```ts
// library/src/main/ets/ResManager.ets // library/src/main/ets/ResManager.ets
export class ResManager{ export class ResManager{
...@@ -97,6 +105,10 @@ export class ResManager{ ...@@ -97,6 +105,10 @@ export class ResManager{
static getDesc(){ static getDesc(){
return $r("app.string.shared_desc"); return $r("app.string.shared_desc");
} }
static getDescStr(){
// 先通过当前上下文获取hsp模块的上下文,再获取hsp模块的resourceManager,然后再调用resourceManager的接口获取Resource对象中资源(返回值为异步结果Promise对象)
return getContext().resourceManager.getStringValue($r("app.string.shared_desc"));
}
} }
``` ```
...@@ -155,12 +167,13 @@ struct Index { ...@@ -155,12 +167,13 @@ struct Index {
Log.info("add button click!"); Log.info("add button click!");
this.message = "result: " + add(1, 2); this.message = "result: " + add(1, 2);
}) })
// ResManager返回Resource对象
Image(ResManager.getPic()) Image(ResManager.getPic())
.width("100%") .width("100%")
Button('getStringValue') Button('getStringValue')
.onClick(()=> { .onClick(()=> {
// 先通过当前上下文获取hsp模块的上下文,再获取hsp模块的resourceManager,然后再调用resourceManager的接口获取资源 // ResManager返回Promise对象(Resource对象解封装结果)
getContext().createModuleContext('library').resourceManager.getStringValue(ResManager.getDesc()) ResManager.getDescStr()
.then(value => { .then(value => {
console.log("getStringValue is " + value); console.log("getStringValue is " + value);
}) })
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册