文档管理中心

如何在Entry模块中访问Library模块中的数据

问题现象

在项目开发中采用了Entry模块结合多个Library模块的设计方式,这种情况下,Library模块中的数据Entry模块如何访问到?

背景知识

  • 模块(Module)是应用的基本功能单元,包含了源代码、资源文件、第三方库及配置文件。一个应用通常会包含一个或多个模块,因此,可以在工程中创建模块
  • 模块(Module)类型:模块按照使用场景可以分为Ability类型的Module和Library类型的Module。前者用于实现应用的功能和特性,后者用于实现代码和资源的共享。

解决方案

通过在Library模块中定义静态变量和导出函数的方法,实现模块之间的数据传递。详细步骤如下:

  1. 创建共享模块:新建工程时选择API 10及以上的Stage模型,工程创建完成后,新建'Static Library'模块。模块创建方法可参考在工程中添加Module

    此案例中通过添加模块方式,创建名为'library'的模块。

  1. 在Library模块中定义函数、常量类;
    收起
    自动换行
    深色代码主题
    复制
    1. // ets/constants/SharedLibraryConstants.ets
    2. export class SharedLibraryConstants {
    3. static readonly ENGLISH: string = 'Hello';
    4. static readonly CHINESE: string = '你好';
    5. }
    6. export function add(a: number, b: number) {
    7. return a + b;
    8. }
    9. export function sub(a: number, b: number) {
    10. return a - b;
    11. }
  2. 在library模块下找到Index.ets,导出第二步中定义的常量类和函数;
    收起
    自动换行
    深色代码主题
    复制
    1. export { SharedLibraryConstants, add, sub } from './src/main/ets/constants/SharedLibraryConstants';
  3. 在Entry模块添加library的依赖:

    Entry的oh-package.json5中增加对library的依赖关系,点击右上角的同步。

    收起
    自动换行
    深色代码主题
    复制
    1. "dependencies": {
    2. "library": "file:../library"
    3. }

    注:这边的'library'是library模块下oh-package.json5中name的名称。

  4. 在Entry模块src/main/ets/pages/Index.ets中导入library模块中定义的函数、常量类,并使用。
    收起
    自动换行
    深色代码主题
    复制
    1. import { add, sub, SharedLibraryConstants } from 'library';
    2. @Entry
    3. @Component
    4. struct Index {
    5. content: string = '10和5,两个数的计算结果: ';
    6. systemContent: string = '语言:';
    7. @State result: string = '';
    8. @State systemResult: string = '';
    9. build() {
    10. Column() {
    11. Text(this.content + this.result)
    12. .fontSize(20)
    13. .fontWeight(FontWeight.Bold)
    14. .margin(10);
    15. Button('加法')
    16. .onClick(() => {
    17. this.result = add(10, 5).toString();
    18. })
    19. .margin(10);
    20. Button('减法')
    21. .onClick(() => {
    22. this.result = sub(10, 5).toString();
    23. })
    24. .margin(10);
    25. Text(this.systemContent + this.systemResult)
    26. .fontSize(20)
    27. .fontWeight(FontWeight.Bold)
    28. .margin(10);
    29. Button('英文')
    30. .onClick(() => {
    31. this.systemResult = SharedLibraryConstants.ENGLISH;
    32. })
    33. .margin(10);
    34. Button('中文')
    35. .onClick(() => {
    36. this.systemResult = SharedLibraryConstants.CHINESE;
    37. })
    38. .margin(10);
    39. }
    40. .width('100%');
    41. }
    42. }
  5. 实现效果,通过上述步骤成功在Entry模块拿到library的数据。如图所示:当点击'加法'时,调用library中定义的加法函数,计算结果为'15'。当点击'减法'时,调用library中定义的减法函数,计算结果为'5'。点击'英文'、'中文'时,分别调用library中定义的SharedLibraryConstants类中的'Hello'、'你好'。

    实现效果:

总结

此类问题涉及整个工程中如何进行数据管理、数据传递,在开发时需明确工程中各个模块的作用,以及它们的依赖关系,并在oh-package.json5中做好依赖定义,工程逻辑结构较清晰且模块间的依赖关系明朗,有利于开发及后期维护。

在 FAQ 中进行搜索
请输入您想要搜索的关键词