鴻蒙運動項目開發:項目運行環境切換器

##鴻蒙核心技術##運動開發#

在開發鴻蒙運動項目時,管理不同運行環境(如開發環境、測試環境、生產環境)是一個常見的需求。通過合理地切換運行環境,開發者可以方便地進行調試、測試和部署。本文將介紹如何實現一個項目運行環境切換器,幫助你在鴻蒙開發中高效地管理不同環境的配置。

前言

在現代軟件開發中,環境管理是確保應用穩定性和可維護性的關鍵環節之一。無論是開發、測試還是生產環境,每個環境都可能有不同的配置需求,例如 API 地址、日志級別、功能開關等。通過實現一個運行環境切換器,我們可以輕松地在不同環境之間切換,而無需修改代碼,從而提高開發效率和靈活性。
在這里插入圖片描述

一、環境切換器的設計

(一)環境配置類型

為了支持不同環境的配置,我們定義了 EnvironmentConfigsCurrentEnvironment 類型。

export type EnvironmentConfigs = Map<string, Map<string, string>>;export interface CurrentEnvironment {name: string;configs: Map<string, string>;
}

核心點解析

  1. EnvironmentConfigs:一個映射表,鍵為環境名稱(如 productiondevelopment),值為該環境的配置映射表。
  2. CurrentEnvironment:表示當前環境的名稱和配置。

(二)環境類型枚舉

我們通過枚舉定義了支持的環境類型。

export enum EnvironmentType {TYPE_PRODUCTION = "production",TYPE_DEVELOP = "develop"
}

核心點解析

  1. 枚舉類型:通過枚舉定義了兩種環境類型:生產環境(production)和開發環境(develop)。可以根據需要擴展更多環境類型。

(三)環境管理類

環境管理類 Environment 是整個環境切換器的核心。它負責存儲環境配置、加載保存的環境、切換環境以及通知回調。

export class Environment {private static instance: Environment;private static readonly ENVIRONMENT_STORAGE_KEY = 'current_environment';private currentEnvironment?: CurrentEnvironment;private environments: EnvironmentConfigs = new Map();private preferences: LibPreferencesSync;private environmentChangeCallbacks: Array<(newEnvironment: CurrentEnvironment) => void> = [];private constructor() {this.preferences = new LibPreferencesSync();}public static getInstance(): Environment {if (!Environment.instance) {Environment.instance = new Environment();}return Environment.instance;}public initEnvironments(evn: EnvironmentConfigs) {this.environments = evn;this.loadSavedEnvironment();}private loadSavedEnvironment() {if (!IS_PRODUCTION) {const savedEnvironmentName = this.preferences.getValue(Environment.ENVIRONMENT_STORAGE_KEY) as string;if (savedEnvironmentName && this.environments.has(savedEnvironmentName)) {this.currentEnvironment = {name: savedEnvironmentName,configs: this.environments.get(savedEnvironmentName)!};} else {this.currentEnvironment = {name: EnvironmentType.TYPE_DEVELOP,configs: this.environments.get(EnvironmentType.TYPE_DEVELOP)!};}} else {this.currentEnvironment = {name: EnvironmentType.TYPE_PRODUCTION,configs: this.environments.get(EnvironmentType.TYPE_PRODUCTION)!};}}public switchEnvironment(name: string) {const configs = this.environments.get(name);if (configs) {this.currentEnvironment = { name, configs };this.preferences.saveKeyValue(Environment.ENVIRONMENT_STORAGE_KEY, name);this.environmentChangeCallbacks.forEach(callback => callback(this.currentEnvironment!));}}public getCurrentEnvironment(): CurrentEnvironment {return this.currentEnvironment!;}public getAllEnvironmentNames(): string[] {return Array.from(this.environments.keys());}public registerEnvironmentChangeCallback(callback: (newEnvironment: CurrentEnvironment) => void) {this.environmentChangeCallbacks.push(callback);}public unregisterEnvironmentChangeCallback(callback: (newEnvironment: CurrentEnvironment) => void) {this.environmentChangeCallbacks = this.environmentChangeCallbacks.filter(cb => cb !== callback);}
}

核心點解析

  1. 單例模式:通過 getInstance 方法確保 Environment 的全局唯一性。
  2. 環境初始化:通過 initEnvironments 方法初始化環境配置。
  3. 加載保存的環境:在 loadSavedEnvironment 方法中,根據存儲的環境名稱加載對應的環境配置。
  4. 環境切換:通過 switchEnvironment 方法切換環境,并通知所有注冊的回調函數。
  5. 回調機制:支持注冊和注銷環境切換回調,方便在環境切換時執行相關操作。

二、環境切換器的使用

(一)環境切換對話框

為了方便用戶切換環境,我們實現了一個環境切換對話框 EnvironmentDialog

@CustomDialog
export struct EnvironmentDialog {public controller: CustomDialogController;private themeManager: ThemeManager = ThemeManager.getInstance();private environment: Environment = Environment.getInstance();public onEnvironmentChanged?: () => void;build() {Column() {Text('選擇環境').fontSize(20).fontWeight(FontWeight.Bold).fontColor(this.themeManager.getTextPrimaryColor()).margin({ top: 24, bottom: 16 })List() {ForEach(this.environment.getAllEnvironmentNames(), (envname: string) => {ListItem() {Row() {Column() {Text(envname).fontSize(16).fontColor(this.themeManager.getTextPrimaryColor()).margin({ bottom: 4 })}.alignItems(HorizontalAlign.Start).layoutWeight(1)if (this.environment.getCurrentEnvironment().name === envname) {Image($r('app.media.base_icon_select')).width(24).height(24).margin({ left: 8 })}}.width('100%').padding(16).backgroundColor(this.themeManager.getSurfaceColor()).borderRadius(8).onClick(() => {this.environment.switchEnvironment(envname);this.onEnvironmentChanged?.();this.controller.close();})}.margin({ bottom: 8 })}, (envname: string) => envname)}.width('100%').layoutWeight(1)Button('關閉').width('100%').height(48).backgroundColor(this.themeManager.getPrimaryColor()).margin({ top: 16 }).onClick(() => {this.controller.close();})}.width('90%').padding(16).backgroundColor(this.themeManager.getBackgroundColor()).borderRadius(16)}
}

核心點解析

  1. 環境列表:通過 ForEach 遍歷所有環境名稱,并為每個環境生成一個列表項。
  2. 當前環境標識:如果當前環境與列表項環境一致,則顯示選中圖標。
  3. 環境切換:點擊列表項時,調用 switchEnvironment 方法切換環境,并關閉對話框。
  4. 回調通知:環境切換后,調用 onEnvironmentChanged 回調函數,通知外部環境已切換。

(二)環境切換的回調機制

為了在環境切換時執行相關操作,我們可以通過注冊回調函數來實現。

const environment = Environment.getInstance();environment.registerEnvironmentChangeCallback((newEnvironment) => {console.log(`環境已切換到: ${newEnvironment.name}`);// 在這里執行環境切換后的相關操作,例如重新加載配置、刷新界面等
});

核心點解析

  1. 注冊回調:通過 registerEnvironmentChangeCallback 方法注冊回調函數。
  2. 回調執行:在環境切換時,回調函數會被自動調用。

三、總結

通過實現一個項目運行環境切換器,我們可以在鴻蒙運動項目中輕松地管理不同環境的配置。環境切換器不僅支持動態切換環境,還提供了回調機制,方便在環境切換時執行相關操作。通過這種方式,開發者可以在開發、測試和生產環境中快速切換,而無需修改代碼,從而提高開發效率和靈活性。

在實際開發中,你可以根據項目的具體需求,進一步擴展和優化環境切換器。例如:

  • 支持更多環境類型:根據項目需求,擴展更多環境類型,如測試環境、預發布環境等。
  • 動態加載配置:從遠程服務器動態加載環境配置
  • 集成到構建工具:將環境切換器集成到構建工具中,支持在構建時指定運行環境。

希望本文能為你的鴻蒙開發之旅提供有價值的參考!如果你有任何問題或建議,歡迎隨時交流。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/85788.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/85788.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/85788.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux內核中安全創建套接字:為何inet_create未導出及正確替代方案

引言 在Linux內核開發中,當驅動程序需要創建網絡套接字時,開發者常會遇到一個關鍵問題:核心函數inet_create(負責初始化IPv4套接字)并未導出到內核符號表。本文深入剖析這一設計決策背后的邏輯,并提供驅動程序安全創建套接字的實踐方案。 一、inet_create未導出的深層原…

63、不同路徑II

題目 解答&#xff1a; 初始化和特殊情況比較麻煩的dp obstacleGrid(0,0)1的&#xff0c;直接return 0即可。入口都被堵住了還怎么走。 mn1情況&#xff0c;直接判斷 第一行初始化&#xff1a;dp[1][0]->dp[i][0] 碰到有障礙物的&#xff0c;從當前格子開始到末尾全部置…

wx小程序登錄設置角色

背景。pc端登錄后在訪問業務鏈接時可以根據固定獲取用戶的方法LoginUser user LoginHelper.getLoginUser(); 獲取到用戶信息。但wx端登錄后無法獲取。原因處在登陸時對用戶信息的設置方面pc端和小程序端登錄沒有使用相同的登錄方法。排除得知wx端小程序登錄時沒有設置角色。所…

MySQL5.7 慢查詢SQL語句集合

文章目錄 1. 按平均執行時間排序的慢查詢2. 按總執行時長排序的慢查詢3. MySQL 5.7 慢查詢配置檢查4. 掃描行數分析&#xff08;找出全表掃描&#xff09;5. 高頻執行的慢查詢6. 當前正在執行的查詢7. 慢查詢統計匯總8. 表結構和索引分析8.1 表索引詳情查詢8.2 表大小統計 1. 按…

MySQL學習(1)——基礎庫操作

歡迎來到博主的專欄:MySQL學習 博主ID:代碼小豪 文章目錄 數據庫原理基礎庫操作增刪數據庫數據庫編碼與校驗規則驗證不同的校驗規則對于庫中數據的影響 備份與恢復數據庫 數據庫原理 mysql版本:mysql8.0 操作系統:ubuntu22.4 為了減少由于環境配置以及權限限制帶來的使用問題&…

C++法則12:右值引用的核心目的:支持移動語義(Move Semantics)

C法則12&#xff1a;右值引用的核心目的&#xff1a;支持移動語義&#xff08;Move Semantics&#xff09; 右值引用&#xff08;Rvalue Reference&#xff09;是C11引入的最重要特性之一&#xff0c;其主要設計目的就是支持移動語義&#xff08;Move Semantics&#xff09;。 …

【LLM學習筆記4】使用LangChain開發應用程序(上)

目錄 前言一、模型、提示和解析器&#xff08;model、prompt、parsers&#xff09;二、儲存三、模型鏈四、基于文檔的問答1.使用向量存儲查詢2. 結合表征模型和向量存儲使用檢索問答鏈回答問題 前言 在前面兩部分&#xff0c;我們分別學習了大語言模型的基礎使用準則&#xff…

Negative Contrastive Estimation Negative Sampling

1. 基本概念與問題背景 1.1 大規模分類問題 在自然語言處理中&#xff0c;給定上下文 c c c預測單詞 w w w的條件概率為&#xff1a; P ( w ∣ c ) exp ? ( s θ ( w , c ) ) ∑ w ′ ∈ V exp ? ( s θ ( w ′ , c ) ) P(w|c) \frac{\exp(s_\theta(w,c))}{\sum_{w\in V…

Flink SQL Connector Kafka 核心參數全解析與實戰指南

Flink SQL Connector Kafka 是連接Flink SQL與Kafka的核心組件&#xff0c;通過將Kafka主題抽象為表結構&#xff0c;允許用戶使用標準SQL語句完成數據讀寫操作。本文基于Apache Flink官方文檔&#xff08;2.0版本&#xff09;&#xff0c;系統梳理從表定義、參數配置到實戰調優…

vscode內嵌瀏覽器實時預覽vue項目

安裝插件 web Preview 啟動vue項目 打開預覽 ctrl shift p 之后輸入并選擇 Open Web Preview 即可看到預覽窗口&#xff0c;但此時明明我的頁面是有內容的&#xff0c;但是窗口卻空白的。 因為默認訪問端口是3000&#xff0c;我們將其修改為vue項目默認的5173端口即可。 點…

計算機網絡:(四)物理層的基本概念,數據通信的基礎知識,物理層下面的傳輸媒體

計算機網絡&#xff1a;&#xff08;四&#xff09;物理層的基本概念&#xff0c;數據通信的基礎知識&#xff0c;物理層下面的傳輸媒體 前言一、物理層的基本概念1. 什么是物理層2. 物理層的核心使命3. 物理層的四大特性 二、數據通信的基礎知識1. 數據通信系統的基本模型1.1 …

Linux系統性能優化

目錄 Linux系統性能優化 一、性能優化概述 二、性能監控工具 1. 基礎工具 2. 高級工具 三、子系統優化策略 1. CPU優化 2. 內存優化 3. 磁盤I/O優化 4. 網絡優化 四、資源限制優化 1. ulimit 2. cgroups&#xff08;控制組&#xff09; 五、安全與注意事項 六、…

【streamlit streamlit中 顯示 mermaid 流程圖有兩種方式】

streamlit中顯示mermaid 流程圖有兩種方式 mermaind示例 code """ flowchart LRmarkdown["This **is** _Markdown_"]newLines["Line1Line 2Line 3"]markdown --> newLinesmarkdown["This **is** _Markdown_"]newLines[&quo…

Rust調用 DeepSeek API

Rust 實現類似 DeepSeek 的搜索工具 使用 Rust 構建一個高效、高性能的搜索工具需要結合異步 I/O、索引結構和查詢優化。以下是一個簡化實現的框架: 核心組件設計 索引結構 use std::collections::{HashMap, HashSet}; use tantivy::schema::{Schema, TEXT, STORED}; use …

Unity3D仿星露谷物語開發69之動作聲音

1、目標 Player動作時產生的聲音&#xff0c;比如砍倒樹木、砸石頭。 2、修復NPC快速行進的bug&#xff08;與本節無關&#xff09; 修改NPCMovement.cs腳本的MoveToGridPositionRoutine方法。 確保npcCalculatedSpeed的速度不少于最慢速度。 原代碼&#xff1a; 修改后的…

【Node.js 的底層實現機制】從事件驅動到異步 I/O

簡介 Node.js 作為 JavaScript 后端運行環境&#xff0c;其核心優勢在于高并發處理能力和非阻塞 I/O 模型。 特點&#xff1a; 高并發處理&#xff1a;單線程事件循環高效處理大量并發連接I/O 密集型任務&#xff1a;非阻塞 I/O 模型避免線程切換開銷&#xff0c;不適合 CPU…

nginx服務器配置時遇到的一些問題

京東云 CentOS 8.2 64位 Nginx配置文件修改后需要重啟或重載服務的原因以及不重啟的后果&#xff1a; ??工作進程不主動重讀配置??&#xff1a; Nginx采用master-worker多進程架構。master進程讀取配置文件并管理worker進程&#xff0c;worker進程處理實際請求。修改配置…

【論文閱讀 | CVPR 2024 |Fusion-Mamba :用于跨模態目標檢測】

論文閱讀 | CVPR 2024 |Fusion-Mamba &#xff1a;用于跨模態目標檢測 1.摘要&&引言2.方法2.1 預備知識2.2 Fusion-Mamba2.2.1 架構特征提取與多模態融合&#xff08;FMB模塊&#xff09;FMB的應用與輸出2.2.2 關鍵組件3.2.2.1 SSCS 模塊&#xff1a;淺層跨模態特征交互…

Nginx-Ingress-Controller自定義端口實現TCP/UDP轉發

背景1 使用deployment部署一個http服務&#xff0c;配合使用ingresstls的解析在ingress終止。 apiVersion: networking.k8s.io/v1 kind: Ingress metadata:annotations:name: test.comnamespace: rcs-netswitch-prod spec:defaultBackend:service:name: rcs-netswitch-prodpo…

基于Vue.js的圖書管理系統前端界面設計

一、系統前端界面設計要求與效果 &#xff08;一&#xff09;系統功能結構圖 設計一個基于Vue.js的圖書管理系統前端界面。要充分體現Vue的核心特性和應用場景&#xff0c;同時結合信息管理專業的知識。要求系統分為儀表盤、圖書管理、借閱管理和用戶管理四個主要模塊&#x…