鸿蒙NEXT开发【记录利用bind(this)解决报错SourceMap is not initialized yet】

【结论】

将 emptyLayout: () => EmptyBuilder(),
修改为 emptyLayout: EmptyBuilder.bind(this),

【起因】

在使用第三方上拉下拉刷新组件时,调用全局封装的空布局组件会报错。

第三方:https://ohpm.openharmony.cn/#/cn/detail/@abner%2Frefresh

报错信息

Error message:Cannot read property observeComponentCreation2 of undefined
Stacktrace:
SourceMap is not initialized yet 
    at EmptyBuilder (entry|entry|1.0.0|src/main/ets/view/CommonBuilder.ts:2:5)
    at emptyLayout (entry|entry|1.0.0|src/main/ets/pages/Page66.ts:63:44)
    at anonymous (entry|@abner/refresh|1.3.4|src/main/ets/RefreshLayout.js:1035:21)
    at ifElseBranchUpdateFunction (/usr1/hmos_for_system/src/increment/sourcecode/foundation/arkui/ace_engine/frameworks/bridge/declarative_frontend/engine/stateMgmt.js:4137:4137)
    at anonymous (entry|@abner/refresh|1.3.4|src/main/ets/RefreshLayout.js:1034:17)
    at updateFunc (/usr1/hmos_for_system/src/increment/sourcecode/foundation/arkui/ace_engine/frameworks/bridge/declarative_frontend/engine/stateMgmt.js:6661:6661)

【示例代码】

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

src/main/ets/view/CommonBuilder.ets

@Builder
export function EmptyBuilder() {
  Stack() {
    Text('空布局测试')
  }
}

src/main/ets/pages/Page66.ets

import { ListView, RefreshController } from '@abner/refresh'
import { EmptyBuilder } from '../view/CommonBuilder'

@Entry
@Component
struct Page65 {
  array: string[] = ['1', '2']
  controller: RefreshController = new RefreshController() //刷新控制器,声明全局变量

  build() {
    Column() {

      ListView({
        items: this.array, //数据源 数组,任意类型
        itemLayout: (item, index) => this.itemLayout(item, index),
        controller: this.controller, //控制器,负责关闭下拉和上拉
        isLazyData: false, //禁止懒加载,也就是使用ForEach进行数据加载
        onRefresh: () => {
          //下拉刷新
          this.controller.finishRefresh();
        },
        onLoadMore: () => {
          //上拉加载
          this.controller.finishLoadMore();
        },
        emptyLayout: EmptyBuilder.bind(this),//这样写() => EmptyBuilder() 如果在当前struct中没问题,但放到全局里就不行了。
        showEmptyLayout: true
      })

    }
    .height('100%')
    .width('100%')
    .justifyContent(FlexAlign.Center)

  }

  /**
   * Author:AbnerMing
   * Describe:条目布局
   * @param item  数据对象
   * @param index  数据索引
   */
  @Builder
  itemLayout(item: Object, index: number): void {
    //条目视图,任意组件
    Column() {
      Text(`item:${item},index:${index}`)
    }
  }
}
### 解决 FRP 子域名功能未启用导致的报错问题 当使用 FRP 配置 Web 服务时,如果遇到 `proxy [proxies]: subdomain and custom domains should not be both empty` 的错误提示,这意味着在配置文件中既没有设置子域名 (`subdomain`),也没有设置自定义域名 (`custom_domains`)。对于没有域名的情况,可以直接使用 IP 地址作为解决方案[^1]。 #### 使用 IP 地址代替域名 如果没有可用的域名,可以在客户端配置文件 (`frpc.ini`) 中将 `custom_domains` 字段替换为服务器的公网 IP 地址。例如: ```ini [web] type = http local_port = 80 custom_domains = 123.123.123.123 ``` 上述配置表示通过指定服务器的公网 IP 来访问服务,而不是依赖于域名解析。 #### 启用子域名支持 如果希望继续使用子域名而非直接暴露 IP,则需要确保服务端已正确启用了子域名功能。这通常涉及以下几个方面: 1. **修改服务端配置文件 (`frps.ini`)** 确保服务端配置文件中设置了允许使用的子域名前缀以及绑定的域名为有效值。例如: ```ini subdomain_host = example.com ``` 这里的 `example.com` 是指代实际用于反向代理的目标域名。如果有多个子域名需求,可以动态分配给不同的客户端连接请求[^2]。 2. **验证 DNS 设置** 如果计划利用子域名方式工作,请确认目标主机名已经指向运行 FRPS 的机器地址,并且该记录生效正常。比如 A 记录或 CNAME 记录均能实现此目的[^3]。 #### 示例完整配置 以下是基于 HTTP 协议的一个典型例子展示如何避免因缺少必要参数引发类似的警告信息: ##### Server Side (frps.ini) ```ini [common] bind_port = 7000 dashboard_port = 7500 vhost_http_port = 80 vhost_https_port = 443 subdomain_host = your-domain.com ``` ##### Client Side (frpc.ini) ```ini [common] server_addr = x.x.x.x server_port = 7000 [web] type = http local_port = 8080 subdomain = testpage # 或者也可以这样写如果你不想用子域名而是想直接映射到某个固定ip上去的话 # custom_domains = y.y.y.y ``` 以上两种方法任选其一即可解决问题并让程序顺利执行下去。 ### 注意事项 - 当采用 TCP 类型的服务时(如 SSH),则不需要关心这些关于HTTP/HTTPS协议下的特殊要求,因为它们并不强制要求存在任何类型的DNS名称关联。 - 对于 Windows 平台上的自动启动设置教程,请参阅其他参考资料了解具体操作步骤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值