返回首页
最新
一年前,我制作了这个包,但从未与任何社区分享过。现在分享出来,希望对你未来有所帮助。<p>如果你喜欢,请别忘了给个星星并留下你的反馈。
我是一个自学成才的开发者,努力工作多年,忍受了多家公司的“我们内部晋升”的谎言,终于得到了写代码的报酬。
自从去年11月被裁员以来,我一直在找工作,现在对此感到厌倦。每个人都在寻找拥有X年Y框架经验的“独角兽”,如果你没有完全符合的条件,就不必申请。与此同时,FAANG、微软和英特尔却不断发放裁员通知。
我仍然热爱编程,自从被裁员以来,我大部分时间都在忙于构建项目,除了“求职申请和存在主义的恐惧”之外。但想到要为另一家由无能的高管管理的公司工作,他们想把AI强行融入一切,或者又要经历一次人力资源部的贝基(她的技术技能有时只是使用Excel)问我“你为什么想在这里工作”的面试,我就感到恶心。
我开始告诉那些会议数量异常多、招聘流程繁琐以及单向视频面试的公司我不感兴趣。我发现自己对几乎任何事情都感到兴奋,只要不是在某个公司经历又一次的规划周,而这个公司还信誓旦旦地说他们在“做敏捷”。
我对公司决定将我们抛弃、将我们的工作外包给他们能找到的最便宜的国家,或者随便选择一家本周提供最好免费蜡笔的AI公司感到愤怒。我对越来越多公司推行的强制回办公室政策感到愤怒,因为他们的管理者工作糟糕,无法理解如何用Slack消息替代面对面的打扰。我感到愤怒,同时也感到疲惫。
还有其他人有这样的感觉吗?
# HarmonyOS Flutter HAP包编译中的常见问题
## 1. 配置别名以简化构建命令
将以下别名添加到您的环境变量中,以便于开发:
*Windows*(通过 Git Bash):
在文件资源管理器中右键点击 → <i>Git Bash Here</i>
*Linux/Mac*:编辑 `~/.bash_profile`,并通过 `source ~/.bash_profile` 将其添加到 `~/.zshrc`。
```
# 可选 --local-engine 用于自定义引擎构建(推荐在 Linux/Mac 上使用)
export ENGINE_DIR=~/ohos/engine
export ENGINE_DEBUG=$ENGINE_DIR/src/out/ohos_debug_unopt_arm64
export ENGINE_PROFILE=$ENGINE_DIR/src/out/ohos_profile_arm64
export ENGINE_RELEASE=$ENGINE_DIR/src/out/ohos_release_arm64
# 构建别名
alias fbuildD="flutter build hap --local-engine=$ENGINE_DEBUG --debug"
alias fbuildP="flutter build hap --local-engine=$ENGINE_PROFILE --profile"
alias fbuildR="flutter build hap --local-engine=$ENGINE_RELEASE --release"
# 运行别名
alias frunD="flutter run -d $(hdc list targets) --local-engine=$ENGINE_DEBUG --debug"
alias frunP="flutter run -d $(hdc list targets) --local-engine=$ENGINE_PROFILE --profile"
alias frunR="flutter run -d $(hdc list targets) --local-engine=$ENGINE_RELEASE --release"
```
*使用示例*:
```
flutter create hello --platforms ohos
cd hello
fbuildD # 构建调试版本
frunD # 运行调试版本
```
------
## 2. 安装后出现白屏
*错误日志*:
```
原因:信号:SIGSEGV(SEGV_MAPERR)@0x00000086e3272bf8
最后致命消息:线程:547846269584[致命:flutter/runtime/dart_vm_initializer.cc]
初始化 Dart VM 时出错:
快照版本错误,预期为 '8af474944053df1f0a3be6e6165fa7cf'
找到 'adb4292f3ec25074ca70abcd2d5c7251'
```
*原因*:引擎构建模式不匹配(例如,使用调试引擎构建发布版本)
*解决方案*:将引擎模式与构建标志匹配:
```
flutter run -d --debug # 调试模式
flutter run -d --release # 发布模式
flutter run -d --profile # 配置模式
```
------
## 3. 插件结构兼容性错误
*错误日志*:
```
糟糕;flutter 意外退出:
“类型 'Null' 不是类型 'List<dynamic>' 的子类型”。
```
*解决方案*:将 Flutter 更新到最新的主分支/开发分支(提交 45bd5e627e1 或更新版本)
------
## 4. `flutter pub get` 时的依赖冲突
*错误日志*:
```
因为 flutter_cache_manager >=3.0.0-nullsafety.0 <3.3.2 依赖于 path_provider...
版本解决失败。pub get 失败... 退出代码:1
```
*解决方案*:在 `pubspec.yaml` 中添加依赖覆盖:
```
dependency_overrides:
path_provider:
git:
url: https://gitee.com/openharmony-sig/flutter_packages.git
path: packages/path_provider/path_provider
path_provider_ohos:
git:
url: https://gitee.com/openharmony-sig/flutter_packages.git
path: packages/path_provider/path_provider_ohos
```
------
## 5. 未接受的 SDK 许可协议
*错误日志*:
```
hvigor 安装成功。
> hvigor 错误:原因:未接受 SDK 许可协议。
```
*原因*:项目使用 API 12 SDK,但项目结构为 API 11
*解决方案*:
1. 在 DevEco Studio 中:<i>迁移助手 → 5.0.0 → 迁移</i>
2. <i>文件 → 项目结构 → 兼容 SDK → 5.0.0(12)</i>
------
## 6. app.json 中版本重置
*问题*:在执行 `flutter build hap --release` 后,app.json 中的 `versionName` 重置为 1.0.0
*解决方案*:在构建命令中明确指定版本:
```
flutter build hap --build-name=4.0.3 --build-number=10000
```
# 在 HarmonyOS 服务小部件中访问应用数据
### (1) 创建服务小部件
在创建基于 ArkTS 的小部件后,项目将生成以下与小部件相关的文件:
- 小部件生命周期管理文件 (`EntryFormAbility.ets`)
- 小部件 UI 文件 (`WidgetCard.ets`)
- 小部件配置文件 (`form_config.json`)
### (2) 配置 module.json5
字段参考文档:
```
"extensionAbilities": [
{
"name": "EntryFormAbility",
"srcEntry": "./ets/entryformability/EntryFormAbility.ets",
"label": "$string:EntryFormAbility_label",
"description": "$string:EntryFormAbility_desc",
"type": "form",
"metadata": [
{
"name": "ohos.extension.form",
"resource": "$profile:form_config"
}
]
}
]
```
### (3) 小部件特定配置
配置位于 `resources/base/profile/form_config.json`。
字段参考文档:
### (4) UI 开发和参数处理
小部件 UI 代码位于 `ets/widget/`。参数接收逻辑:
```
let storageUpdateByMsg = new LocalStorage();
@Entry(storageUpdateByMsg)
@Component
struct WidgetCard {
@LocalStorageProp('diffExamDay') diffExamDay: number = -1;
}
```
### (5) 小部件生命周期和数据传递
- 在 `EntryFormAbility.onAddForm` 中的初始化逻辑(例如,将小部件 ID 传递给 WidgetCard)
- 在 `onUpdateForm` 钩子中处理更新
### (6) 在小部件初始化期间访问应用数据
#### 6.1 通知应用更新小部件数据
```
postCardAction(this, {
action: "call",
abilityName: "EntryAbility",
params: {
method: "upDiffExamDay",
formId: this.formId,
},
});
```
*时序问题解决方案:*
监控 `formId` 的变化,而不是使用 `aboutToAppear()`:
```
@LocalStorageProp('formId') @Watch('updateFormId') formId:string = '';
updateFormId() {
postCardAction(this, {
action: 'call',
abilityName: 'EntryAbility',
params: {
method: 'upDiffExamDay',
formId: this.formId
}
});
}
```
#### 6.2 应用端数据处理
在 `EntryAbility.onCreate` 中:
```
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
this.callee.on('upDiffExamDay', upDiffExamDayCall);
}
const upDiffExamDayCall = (data: rpc.MessageSequence): MyParcelable => {
let params: Record<string, string> = JSON.parse(data.readString());
if (params.formId) {
PreferencesUtil.putSync('formId', params.formId);
const diffExamDay = UserCacheManager.getDiffExamDay();
diffExamDay === -1
? getHomePageData(params.formId) // 如果数据不可用则获取数据
: Utils.updateDiffExamDay(params.formId); // 直接更新小部件
}
return new MyParcelable(1, 'success');
};
```
*更新小部件数据:*
```
// 导入所需模块
import { formBindingData, formProvider } from '@kit.FormKit';
updateDiffExamDay(formId: string) {
const diffExamDay = UserCacheManager.getDiffExamDay();
let formMsg = formBindingData.createFormBindingData({
'diffExamDay': diffExamDay
});
formProvider.updateForm(formId, formMsg)
.then(() => console.log('更新成功'))
.catch((error) => console.error('更新失败:', error));
}
```
GFiber
<p>我们迫不及待想要为您提供服务,但目前还没有达到这个阶段。</p>
<p>很抱歉给您带来了困扰。由于系统错误,您错误地收到了“服务可用”的通知。不幸的是,Google Fiber 目前在您的住所不可用(我们对此也感到遗憾)。</p>
<p>当您的地址符合服务条件时,我们会向您发送邀请以进行注册。</p>
<p>感谢您的耐心等待,再次对造成的混淆表示歉意。</p>
<p>我们非常感谢您对 GFiber 的关注!</p>
<p>– GFiber团队</p>
你好。
我创建了一个 TypeScript 包,通过在类型层面实现一种名为 CionLisp 的脚本语言,来实现类似依赖类型的检查。通过从运行时值中提取类型,它能够进行 TypeScript 原生不支持的类型验证。
使用这个包,我实现了几个功能,包括:
- 除零检测
- 长度索引向量(类似于 Idris 中的 Vect n)
- 安全访问器(类似于 Lenses)
此外,任何可以在 CionLisp 中表达并在类型层面上解析的内容,例如通过正则表达式进行的电子邮件验证,也有可能进行类型检查。
请注意,这仍处于 alpha 阶段,因此请谨慎使用。
感谢您的关注。
我现在36岁,怀念和朋友们一起打扑克的那些深夜。<p>我们都忙于家庭和事业,几乎没有时间进行游戏。<p>于是我想到了回合制扑克,类似于《与朋友一起的单词》,但适用于德州扑克。<p>当轮到你行动时会收到推送通知,这样我们就可以在火车上、会议间隙、甚至在厕所里玩。<p>这个应用完全基于Expo + React Native + Firebase,并且有一个NextJS后端。<p>我在React Native的基础上编写了一个自定义动画引擎,用于渲染扑克牌的动画。<p>希望你喜欢!
我创建了一个简单的 WireGuard 配置生成器,适用于 Mesh 和 Hub-Spoke 网络。<p>目标包括:
- 安全,仅限客户端
- 从种子生成以便重现密钥生成
- 简单的自托管
- 开源(MIT 许可证)<p>该项目尚未完成,我希望在未来添加一些功能,并进行安全审计(主要是为了学习)。<p>我非常欢迎您的反馈。
News-Hook 是一个用于在任何现实世界中设置网络钩子的工具,只需使用提示即可。<p>您可以写出类似这样的提示:<p>“当 [电影] 获得烂番茄评分时通知我”
“当 [谣言] 被确认或否认时告诉我”
“在美国和巴西之间的任何关税新闻时提醒我”<p>它的工作原理如下:<p>- 您写下一个提示,说明您想要获取的信息。
- 像往常一样设置一个网络钩子,包括 URL 和有效负载。
- 完成。<p>如果您想通过编程方式实现,还有完整的 API 可供使用。
我们提供了 Swagger-UI,方便您查看。<p>非常欢迎反馈、我未考虑到的使用案例,以及对设计或安全性的批评。<p>谢谢!