开发者技术支持-AppStorage与AppStorageV2之间转化
        【摘要】 1.问题说明:在开发中可能会遇到这样的情景,以前的项目是用V1写的,由于某种需要,需要转成V2;其中在处理跨页面数据共享这块儿,在V1中通常使用的是AppStorage,而V2中没有AppStorage。这个时候若想实现这种功能,可以选用AppStorageV2。2.原因分析:在V1与V2的转化过程中遇到过这种情况,V1的写法是本地的修改不同步AppStorage,但AppStorage的变...
    
    
    
    1.问题说明:在开发中可能会遇到这样的情景,以前的项目是用V1写的,由于某种需要,需要转成V2;其中在处理跨页面数据共享这块儿,在V1中通常使用的是AppStorage,而V2中没有AppStorage。这个时候若想实现这种功能,可以选用AppStorageV2。
2.原因分析:在V1与V2的转化过程中遇到过这种情况,V1的写法是本地的修改不同步AppStorage,但AppStorage的变化能够通知到使用@StorageProp装饰器的组件;如下:
import { common, Want } from '@kit.AbilityKit';
@Entry
@Component
struct Index {
  @StorageProp('count') count: number = 0;
  private context = this.getUIContext().getHostContext() as common.UIAbilityContext;
  build() {
    Column() {
      Text(`EntryAbility count: ${this.count}`)
        .fontSize(25)
        .onClick(() => {
          this.count++;
        })
      Button('change Storage Count')
        .onClick(() => {
          AppStorage.setOrCreate('count', AppStorage.get<number>('count') as number + 100);
        })
      Button('Jump to EntryAbility1').onClick(() => {
        let wantInfo: Want = {
          bundleName: 'com.example.myapplication', // 替换成AppScope/app.json5里的bundleName
          abilityName: 'EntryAbility1'
        };
        this.context.startAbility(wantInfo);
      })
    }
  }
}
// EntryAbility1 Index1.ets
import { common, Want } from '@kit.AbilityKit';
@Entry
@Component
struct Index1 {
  @StorageProp('count') count: number = 0;
  private context = this.getUIContext().getHostContext() as common.UIAbilityContext;
  build() {
    Column() {
      Text(`EntryAbility1 count: ${this.count}`)
        .fontSize(50)
        .onClick(() => {
          this.count++;
        })
      Button('change Storage Count')
        .onClick(() => {
          AppStorage.setOrCreate('count', AppStorage.get<number>('count') as number + 100);
        })
      Button('Jump to EntryAbility').onClick(() => {
        let wantInfo: Want = {
          bundleName: 'com.example.myapplication', // 替换成AppScope/app.json5里的bundleName
          abilityName: 'EntryAbility'
        };
        this.context.startAbility(wantInfo);
      })
    }
  }
}
这是V1的写法,我们需要把这种写法转成V2,这个时候就要用AppStorageV2进行替代
3.解决思路:
虽然V2中没有@StorageProp,但是我们可以使用@Monitor和@Local实现类似效果
“@StorageProp('count') count: number = 0;”这种写法可以用@Monitor和@Local进行替换。
首先创建一个对象:
@ObservedV2
export class MyStorage {
  @Trace count: number = 0;
}
接着
@Entry
@ComponentV2
struct Index {
  @Local storage: MyStorage = AppStorageV2.connect(MyStorage, 'storage', () => new MyStorage())!;
  @Local count: number = this.storage.count;
  private context = this.getUIContext().getHostContext() as common.UIAbilityContext;
  @Monitor('storage.count')
  onCountChange(mon: IMonitor) {
    console.info(`Index1 ${mon.value()?.before} to ${mon.value()?.now}`);
    this.count = this.storage.count;
  }
  build() {
    Column() {
      Text(`EntryAbility1 count: ${this.count}`)
        .fontSize(25)
        .onClick(() => {
          this.count++;
        })
      Button('change Storage Count')
        .onClick(() => {
          this.storage.count += 100;
        })
      Button('Jump to EntryAbility1').onClick(() => {
        let wantInfo: Want = {
          bundleName: 'com.example.myapplication', // 替换成AppScope/app.json5里的bundleName
          abilityName: 'EntryAbility1'
        };
        this.context.startAbility(wantInfo);
      })
    }
  }
}
import { common, Want } from '@kit.AbilityKit';
import { AppStorageV2 } from '@kit.ArkUI';
@ObservedV2
export class MyStorage {
  @Trace count: number = 0;
}
@Entry
@ComponentV2
struct Index1 {
  @Local storage: MyStorage = AppStorageV2.connect(MyStorage, 'storage', () => new MyStorage())!;
  @Local count: number = this.storage.count;
  private context = this.getUIContext().getHostContext() as common.UIAbilityContext;
  @Monitor('storage.count')
  onCountChange(mon: IMonitor) {
    console.info(`Index1 ${mon.value()?.before} to ${mon.value()?.now}`);
    this.count = this.storage.count;
  }
  build() {
    Column() {
      Text(`EntryAbility1 count: ${this.count}`)
        .fontSize(25)
        .onClick(() => {
          this.count++;
        })
      Button('change Storage Count')
        .onClick(() => {
          this.storage.count += 100;
        })
      Button('Jump to EntryAbility').onClick(() => {
        let wantInfo: Want = {
          bundleName: 'com.example.myapplication', // 替换成AppScope/app.json5里的bundleName
          abilityName: 'EntryAbility'
        };
        this.context.startAbility(wantInfo);
      })
    }
  }
}
4.解决方案:
如上,解决这个过程,只需要把
@StorageProp('count') count: number = 0;
转化为
- @Local storage: MyStorage = AppStorageV2.connect(MyStorage, 'storage', () => new MyStorage())!;
 - @Local count: number = this.storage.count;
 - private context = this.getUIContext().getHostContext() as common.UIAbilityContext;
 - @Monitor('storage.count')
 - onCountChange(mon: IMonitor) {
 - console.info(`Index1 ${mon.value()?.before} to ${mon.value()?.now}`);
 - this.count = this.storage.count;
 - }
 
        【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
            cloudbbs@huaweicloud.com
        
        
        
        
        
        
        - 点赞
 - 收藏
 - 关注作者
 
            
           
评论(0)