Flutter报错:HarmonyOS鸿蒙Next中TypeError: type 'Null' is not a subtype of type 'String' in type cast

Flutter报错:HarmonyOS鸿蒙Next中TypeError: type ‘Null’ is not a subtype of type ‘String’ in type cast 【

6 回复

useNormalizedOHMUrl字段表示是否使用标准化的OHMUrl格式,若工程引用了HAR/HSP,需确保工程的useNormalizedOHMUrl配置和HAR/HSP的useNormalizedOHMUrl配置保持一致,同时配置为true或false。

当useNormalizedOHMUrl设置为true时,不允许通过相对路径跨模块或绝对路径导入文件,oh-package.json5中依赖的包使用的别名需要和依赖包的oh-package.json5的name保持一致

请问项目中这些配置是正确的吗?

更多关于Flutter报错:HarmonyOS鸿蒙Next中TypeError: type 'Null' is not a subtype of type 'String' in type cast的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


框架问题,等待更新ing

请问是已经发现了问题吗,具体是啥问题呢,看看能不能帮到您,

错误根源分析

  1. HAR模块兼容性问题 初始错误 Bytecode HARs not supported 是由于项目依赖的 @cashier_alipay/cashiersdk@alipay/blueshieldsdk HAR包需要启用 useNormalizedOHMUrl 配置。但开启该配置后触发了类型转换异常,说明配置变更暴露了代码中的空值传递问题。

  2. 类型转换异常本质 Null is not a subtype of String 错误发生在 OhosModule.fromOhosProject 方法中,具体原因是框架尝试将 null 值强制转换为 String 类型。这种问题通常由以下场景引发:

    • 项目配置文件中缺少必填字段(如 targetSdkVersion
    • HAR包版本与当前HarmonyOS SDK存在兼容性问题
    • 构建缓存中存在残留的旧配置

可以尝试在 application_package.dart 的报错位置(line 270)添加空值检查:

// 修改前
final String moduleName = project.manifest.moduleName as String;

// 修改后
final String moduleName = project.manifest.moduleName?.toString() ?? 'default_module';

该问题可能涉及Flutter for HarmonyOS工具链的已知缺陷,建议关注官方GitHub仓库

在鸿蒙Next中使用Flutter时,出现TypeError: type 'Null' is not a subtype of type 'String' in type cast错误,通常是因为在类型转换(如as String)时,变量值为null,而目标类型String不接受null值。这属于Dart空安全(null safety)下的类型不匹配问题。请检查相关变量的赋值和空值处理逻辑,确保在转换前变量不为null,或使用空安全操作符(如?!??)进行安全处理。

这个错误是典型的Flutter工具链在解析HarmonyOS项目配置时,遇到了空值(Null)但预期是字符串(String)的类型转换问题。

从堆栈信息看,错误发生在 OhosModule.fromOhosProject 方法中(第270行),具体是在尝试将某个值强制转换为String时,该值实际为Null。这通常是因为项目配置文件(如 build-profile.json5module.json5)中的某些字段缺失或值为空,但Flutter的HarmonyOS工具插件在解析时未做空安全处理。

解决步骤:

  1. 检查项目级 build-profile.json5 文件:确保 "useNormalizedOHMUrl": true 已正确添加在 "harmony" 配置块内。同时,检查文件结构是否完整,没有语法错误。

    // 项目级 build-profile.json5
    {
      "app": { ... },
      "modules": [ ... ],
      "harmony": {
        "useNormalizedOHMUrl": true // 确保此项存在且为 true
      }
    }
    
  2. 检查模块级 build-profile.json5 文件:在您的Entry模块(通常是 entry 目录下)中,确认已正确配置 targetSdkVersion 等必填字段。初始警告已提示此问题。

    // 模块级 build-profile.json5 (例如 entry/build-profile.json5)
    {
      "apiType": 'stageMode',
      "buildOption": {
        "externalNativeOptions": { ... }
      },
      "targets": [
        {
          "name": "default",
          "runtimeOS": "HarmonyOS",
          "targetSdkVersion": 10, // 请根据您的目标版本设置,例如 10
          ...
        }
      ]
    }
    
  3. 检查 oh-package.json5 文件:错误日志中提到了 package_info_plus 包的 oh-package.json5 文件警告。请检查该文件,确保 "main""types" 字段至少有一个被正确设置。对于HAR包,通常需要设置 "types" 字段指向 .d.ts 声明文件。

    // 例如,在 package_info_plus 包的 oh-package.json5 中
    {
      "name": "@ohos/package_info_plus",
      "types": "./index.d.ts", // 确保此路径有效
      ...
    }
    
  4. 清理并重建:在修改配置文件后,执行以下命令清理构建缓存并重新构建:

    fvm flutter clean
    # 然后再次运行您的构建或运行命令,例如:
    # fvm flutter run
    # 或使用 DevEco Studio 的 clean project 和 rebuild 功能
    

核心问题分析: 第一个错误是关于字节码HAR(@cashier_alipay/cashiersdk, @alipay/blueshieldsdk)在 useNormalizedOHMUrl 不为 true 时不支持。您将其设置为 true 后,触发了更深层次的配置解析逻辑,但该逻辑在处理项目数据时,某个预期为字符串的字段得到了 null 值,导致类型转换失败。

因此,重点在于确保所有必要的项目配置字段都已填写且有效,特别是 targetSdkVersion 和HAR包的 main/types 声明。

回到顶部