沉浸式显示
注意:
由于整个应用都开启了全屏显示,那些不需要全屏显示的页面也一并开启了,导致出现了问题:
问题:内容突破了整个安全区域,靠手机顶部显示了内容
解决:需要通过获取手机的安全高度来结合 padding(或其他空间间距)来适配顶部内容的正常显示
创建
//导入窗口模块
import { window } from '@kit.ArkUI'
export class WindowManager {
// 开启全屏
static async enableFullScreen() {
// 1.0 利用了系统的window 这个api的getLastWindow方法获取到了当前的窗口
const win = await window.getLastWindow(getContext())
// 2.0 利用当前窗口的setWindowLayoutFullScreen方法设置全屏: true:设置全屏 false:取消全屏
win.setWindowLayoutFullScreen(true)// 开启了当前页面的沉浸式模式(开启全屏模式)
let area = win.getWindowAvoidArea(window.AvoidAreaType.TYPE_SYSTEM)
// 将topHeight保存到本地存储中
AppStorage.setOrCreate('topHeight', px2vp(area.topRect.height))
}
// 关闭全屏
static async disableFullScreen() {
const win = await window.getLastWindow(getContext())
win.setWindowLayoutFullScreen(false)
// 将topHeight保存到本地存储中
AppStorage.setOrCreate('topHeight', 0)
}
// 设置状态栏为亮色
static async settingStatusBarLight() {
const win = await window.getLastWindow(getContext())
win.setWindowSystemBarProperties({
// 状态栏的背景颜色
// statusBarColor:'',
// 状态栏文字颜色
statusBarContentColor: '#ffffff'
})
}
// 设置状态栏为暗色
static async settingStatusBarDark() {
const win = await window.getLastWindow(getContext())
win.setWindowSystemBarProperties({
// 状态栏的背景颜色
// statusBarColor:'',
// 状态栏文字颜色
statusBarContentColor: '#000000'
})
}
}
调用
//导入自定义沉浸式模式
import { WindowManager } from '../common/utils/WindowManager'
async aboutToAppear() {
// 使页面全屏
WindowManager.enableFullScreen()
}
async aboutToDisappear() {
// 关闭全屏
WindowManager.disableFullScreen()
}
//开启页面状态栏文字颜色亮色
aboutToAppear(): void {
WindowManager.settingStatusBarLight()
}
//开启页面状态栏文字颜色暗色
aboutToDisappear(): void {
WindowManager.settingStatusBarDark()
}
页面设置安全高度
// 获取AppStrorage中的数据
@StorageProp("topHeight") topHeight:number = 0
//(容器组件)
.padding({top:this.topHeight})
index.ets中设置底部tab栏距离底部间隙
- index.ets中的tabs组件上通过 padding({bottom:15}) 来设置tab栏贴住底部被Home键盖住的问题
.padding({ bottom: 15 })
axios网络请求
创建
import axios, { AxiosError, AxiosRequestConfig, AxiosResponse, InternalAxiosRequestConfig } from '@ohos/axios'
import { iLoginUserModel } from '../../models/AccountModel';
import { promptAction, router } from '@kit.ArkUI';
export const instance = axios.create({
baseURL: 'https://api-harmony-teach.itheima.net/'
})
export interface iRes<T> {
/** 请求成功10000标志 */
code: number;
/** 返回数据 */
data: T;
/** 请求成功 */
message: string;
/** 请求成功标志 */
success: boolean;
}
export function request<T = null, D = null>(config: AxiosRequestConfig<D>) {
return instance<null, AxiosResponse<iRes<T>, D>, D>(config)
}
// 添加请求拦截器
instance.interceptors.request.use(
(config: InternalAxiosRequestConfig) => {
const user = AppStorage.get('user') as iLoginUserModel
// console.log('user---', JSON.stringify(user))
// console.log('user', JSON.stringify(config.url))
if (user !== undefined) {
config.headers.Authorization = `Bearer ${user.token}`
}
return config;
},
(error: AxiosError) => {
return Promise.reject(error);
});
// 添加响应拦截器
instance.interceptors.response.use(
(res: AxiosResponse) => {
//统一处理异常: 业务状态码不为10000的异常
if (res.data.code !== 10000) {
promptAction.showToast({ message: res.data.message })
return Promise.reject(res);
}
//阻止后续代码执行
return res;
},
(error: AxiosError) => {
// 401逻辑处理
if (error.response?.status === 401) {
promptAction.showToast({ message: '登录过期,请重新登录' })
setTimeout(() => {
router.clear()
AppStorage.delete('user')
router.replaceUrl({
url: 'pages/LoginPage'
}, 500)
})
return
}
//开发时校验代码_业务逻辑处理
AlertDialog.show({ message: '失败:' + JSON.stringify(error, null, 2), alignment: DialogAlignment.Center })
return Promise.reject(error);
});
调用
import { request } from '../utils/request';
const res = await request<ICockData>({
url: 'hm/clockinInfo',
})