鸿蒙开发实战-OpenHarmony之天气应用

news2024/11/22 15:31:06

“天气之子”

功能描述:

通过请求免费API获取指定城市七天内相关天气信息

开发环境:

IDE:DEV ECO 4.0.600

SDK:4.0.10.15

开发板:DAYU200 4.0.10.16

开发过程

一. 创建项目,调试环境

1.创建项目

#星计划#OpenHarmony开发天气查询应用_OpenHarmony

2.选择OpenHarmony、API10

#星计划#OpenHarmony开发天气查询应用_OpenHarmony_02

3.连网条件下加载依赖

#星计划#OpenHarmony开发天气查询应用_ArkUI_03

4.在开发板上签名,运行HelloWorld测试环境

直接运行,然后点击log报错直达签名

在工具栏File/Project Structure/Signing Configs,勾选Automatically generate签名;运行HelloWorld。

二.修改图标和名称

1.设置-应用管理页面

AppScope/app.json5中查看相关配置

2.桌面

src/main/module.json5中查看相关配置

最终效果:

#星计划#OpenHarmony开发天气查询应用_ArkUI_04

#星计划#OpenHarmony开发天气查询应用_OpenHarmony_05

三.添加网络权限

因为需要用到网络数据,所以添加initent权限。

在src/main/module.json5的model中添加配置。

   "requestPermissions": [{
      "name": "ohos.permission.INTERNET"
    }],

四.自定义Model

在ets中新建model文件夹,建立ArkTS文件,基于API返回结果结合需要自定义类
API返回结果:
#星计划#OpenHarmony开发天气查询应用_OpenHarmony_06

源码如下

export class Item{
  name:string = "紫外线强度指数"
  level:string = "中等"
  // code:string = "uv"
}

export class Result1{//每1天
  city:string = '徐州'
  date:Date = new Date
  temp_day:number = 4
  temp_night:number = -1
  wea_day:string = "晴"
  wea_night:string = '晴'
  wind_day:string = "南风"
  wind_night:string = "南风"
  wind_day_level:string = "<3级"
  wind_night_level:string = "<3级"
  air_level:string = "轻度"
  sunrise:string = "07:17"
  sunset:string = "17:19"
  index:Array<Item> = []//建议
}

export class Result0{
  code:number = 200
  msg:string = 'success'
  data:Array<Result1> = []//7天
}

五.制作index页面、请求网络数据

1.请求网络数据

1.导入http模块

import http from '@ohos.net.http';
import { BusinessError } from '@ohos.base';

2.创建createHttp

let httpRequest = http.createHttp();

3.填写HTTP地址

httpRequest.request(// 填写HTTP请求的URL地址,可以带参数也可以不带参数。URL地址需要开发者自定义。请求的参数可以在extraData中指定
      "https://v2.alapi.cn/api/tianqi/seven",
      {
        method: http.RequestMethod.GET, // 可选,默认为http.RequestMethod.GET
        // // 开发者根据自身业务需要添加header字段
        header: [{
          'Content-Type': 'application/json'
        }],
        // 当使用POST请求时此字段用于传递内容
        extraData: {
          "token": "自己的token",
          "type": "all",
          "format": "json"
        },
   
      }, (err: BusinessError, data: http.HttpResponse) => {
 
    }
    );

4.对网络数据的处理

if (!err) {
        let result:Result0 = JSON.parse(data.result.toString())
        if(result.code == 200){
          this.a = result.data
        }
        else {
          this.message = result.msg
        }
        httpRequest.destroy();
      } else {
        this.message = JSON.stringify(err)
        // console.error('error:' + JSON.stringify(err));
        // 当该请求使用完毕时,调用destroy方法主动销毁
        httpRequest.destroy();
      }

完整代码:

GetData(city:string) {
  // 3.每一个httpRequest对应一个HTTP请求任务,不可复用
  let httpRequest = http.createHttp();
  // 4.
  httpRequest.request(// 填写HTTP请求的URL地址,可以带参数也可以不带参数。URL地址需要开发者自定义。请求的参数可以在extraData中指定
    "https://v2.alapi.cn/api/tianqi/seven",
    {
      method: http.RequestMethod.GET, // 可选,默认为http.RequestMethod.GET
      extraData: {
        "token": "自己的token",
        "city":city,
      },
    },
    (err: BusinessError, data: http.HttpResponse) => {
      if (!err) {
        let result:Result0 = JSON.parse(data.result.toString())
        if(result.code == 200){
          this.a = result.data
        }
        else {
          this.message = result.msg
        }
        httpRequest.destroy();
      } else {
        this.message = JSON.stringify(err)
        // console.error('error:' + JSON.stringify(err));
        // 当该请求使用完毕时,调用destroy方法主动销毁
        httpRequest.destroy();
      }
    }
  )
}

如果显示2300006错误码,很可能是网络问题

2.制作UI

1.文本输入框

TextInput({
      placeholder:"请输入查询城市名,如:徐州",
    }).onChange((item:string)=>{
      if(item!=null && item!=undefined){
        this.message = item
      }
    }).maxLength(8).type(InputType.Normal)

2.“查询”按钮:点击页面进行跳转到列表页

Button("查询").onClick(()=>{
      this.GetData(this.message)
      //跳转
      if(this.a!=null && this.a!=undefined && this.a.length>0){
        router.pushUrl({
          url:"pages/ListPage",
          params:this.a
        })
      }
      else{
        promptAction.showToast({message:"请重试~"})//数据请求失败
      }
    }).backgroundColor(Color.Transparent).width("50%")

最终界面:
#星计划#OpenHarmony开发天气查询应用_ArkUI_07

六.制作列表页(跳转到的第二张页面)

先看最终效果:
#星计划#OpenHarmony开发天气查询应用_ArkUI_08

1.自定义组件

#星计划#OpenHarmony开发天气查询应用_ArkUI_09

Component装饰器修饰,定义struct,并且用关键字export导出

@Component
export struct ALine{//日期 天气图片 详情跳转
  @State date:Date = new Date
  @State wea:string = '晴'

  build(){
    Row(){
      Text(this.date.toString()).fontSize(25).fontWeight(FontWeight.Bold).margin({right:240}).fontColor(Color.White)

      Text("(白天)"+this.wea).fontColor(Color.White)

      Text("  >").fontWeight(FontWeight.Lighter).fontSize(30).fontColor(Color.White)
    }.width("100%").height("100%")
    .border({color:Color.Transparent}).borderRadius(14).borderWidth(3)
    .backgroundImage($r("app.media.LLBG")).backgroundImagePosition(Alignment.Center)
  }
}

2.页面UI

1.首先接收上一页面传输数据

@State a:Array<Result1> = router.getParams() as Array<Result1>

2.主要用到List,Column,Row,Text和自定义组件;利用ForEach循环渲染;每一个自定义组件绑定一个点击事件,可分别跳转到详情页。

源码:

Column({space:5}){
      Text(this.a[0].city).fontSize(50).fontColor(Color.White)

      List({space:20}){
        ForEach(this.a,(item:Result1)=>{
          ListItem(){
            ALine({date:item.date,wea:item.wea_day})
              .onClick(()=>{//
                router.pushUrl({
                  url:"pages/DetailPage",
                  params:item
                })
              })
          }.height("20%").width("100%")
        })
      }.width("100%").height("100%").scrollBar(BarState.Off)
    }.backgroundImage($r("app.media.LPBG")).backgroundImageSize(ImageSize.Cover)

七.制作详情页(点击自定义组件跳转到的第三张页面)

有了前面两张页面的基础,这一张可以较为顺利完成,故不再赘述。

最终效果:
#星计划#OpenHarmony开发天气查询应用_ArkUI_10
本文主要是对鸿蒙开发中的实战讲解,制作天气应用原生开发。有关更多的实战学习,可以往主页;鸿蒙的技术分布内容有如下:

高清完整或者实战文档,可以找我保存

八.总结

此项目主要练习了:

  1. List,Column,Row,Text,Divider,Image,promptAction等组件及其属性
  2. 网络数据请求
  3. 页面跳转及传输数据
  4. 自定义组件
  5. 自定义类
  6. 做自己喜欢的UI

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1406290.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker数据持久化与数据共享

Docker部署了项目&#xff0c;但还有一个很重要的问题就是容器中产生的数据&#xff08;比如log文件&#xff09;&#xff0c;容器一旦被删除&#xff0c;容器内的所有数据也就没有了&#xff0c;为了避免这个问题我们可以将数据存储到容器之外&#xff08;比如宿主机&#xff…

手机短视频素材哪里下载?手机做短视频库有哪些?

在移动互联网时代&#xff0c;手机已成为我们日常生活中不可或缺的工具。许多人喜欢使用手机制作短视频&#xff0c;分享自己的生活和创意。但是&#xff0c;高质量的视频素材对于制作出色的短视频至关重要。那么&#xff0c;手机短视频素材哪里可以下载&#xff1f;有哪些适合…

STM32(更新中)

目录 1 时钟&#xff08;心跳&#xff09; 1.1 CubeMX基本配置 1.2 外设在时钟上的分配原理 1.3 时钟树 2 寄存器&#xff08;地址&#xff09; 3 GPIO 3.1 GPIO实物 3.2 GPIO两种结构&#xff08;推挽/开漏&#xff09; 3.3 LED 3.4 CUBEMX 3.5 常用函数 …

最强生产力|卸载并重装Anaconda3

一、Anaconda3卸载 &#xff08;一&#xff09;官方方案一&#xff08;Uninstall-Anaconda3-不能删除配置文件&#xff09; 官方推荐的方案是两种&#xff0c;一种是直接在Anaconda的安装路径下&#xff0c;双击&#xff1a; &#xff08;可以在搜索栏或者使用everything里面搜…

使用css将文字在水平线中显示

方法一&#xff1a; 1.效果图 2.html <!-- <div class"line">第三方登录</div> --> 3.css /* 让文字在水平线中显示 */.line {display: flex;flex-direction: row;color: #ccc;font-size: 18px;font-weight: bolder; }.line:before, .line:aft…

Spring boot3.x 无法向 Nacos2.x进行服务注册的问题

一&#xff1a;问题描述 配置中心都是可用的&#xff0c;但是就是无法向nacos进行服务注册。 二&#xff1a;问题可能出现的原因有如下两种 1.Nacos2.0版本相比1.X新增了gRPC的通信方式&#xff0c;因此需要增加2个端口。除了8848还需要开放9848&#xff0c;9849端口。 官方…

阿里云负载均衡对接

1 、开通负载均衡产品 2 、ALB / NLB / CLB ALB&#xff1a; 应用型负载均衡 &#xff0c; 给定对应服务域名与当前实例DNS绑定之后即可使用 支持&#xff1a; HTTP/HTTPS/QUIC等应用层流量协议 NLB&#xff1a; 网络型负载均衡 支持&#xff1a; TCP / UDP / TCPSSL C…

安装miniconda、tensorflow、libcudnn

目录 安装miniconda 安装tensorflow 安装 libcudnn 安装miniconda wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh && bash Miniconda3-latest-Linux-x86_64.sh 安装tensorflow tensorflow官网&#xff0c;查看版本对应 https:…

阿里云 Flink 原理分析与应用:深入探索 MongoDB Schema Inference

摘要&#xff1a;本文整理自阿里云 Flink 团队归源老师关于 阿里云 Flink 原理分析与应用&#xff1a;深入探索 MongoDB Schema Inference 的研究&#xff0c;内容主要分为以下四部分&#xff1a; 1. MongoDB 简介 2. 社区MongoDB CDC 核心特性 3. MongoDB CDC 在阿里云 Flink …

网络通信(18)-C#TcpClient 和 TcpListener的使用实例

本文演示C#TcpClient 和 TcpListener的使用实例,掌握基本用法。 目录 TcpListener服务器 客户端TcpClient TcpListener服务器 界面 UI代码 namespace TcpListenerDemo {partial class Form1{/// <summary>/// 必需的设计器变量。/// </summary>private System…

【GitHub项目推荐--不错的Rust开源项目】【转载】

01 Rust 即时模式 GUI 库 egui 是一个简单、快速且高度可移植的 Rust 即时模式 GUI 库&#xff0c;可以轻松地将其集成到你选择的游戏引擎中&#xff0c;旨在成为最易于使用的 Rust GUI 库&#xff0c;以及在 Rust 中制作 Web 应用程序的最简单方法。 项目地址&#xff1a;ht…

对齐大型语言模型与人类偏好:通过表示工程实现

1、写作动机&#xff1a; 强化学习表现出相当复杂度、对超参数的敏感性、在训练过程中的不稳定性&#xff0c;并需要在奖励模型和价值网络中进行额外的训练&#xff0c;导致了较大的计算成本。为了解决RL方法带来的上述挑战&#xff0c;提出了几种计算上轻量级的替代方案&…

图像处理算法:白平衡、除法器、乘法器~笔记

参考&#xff1a; 基于FPGA的自动白平衡算法的实现 白平衡初探 (qq.com) FPGA自动白平衡实现步骤详解-CSDN博客 xilinx 除法ip核&#xff08;divider&#xff09; 不同模式结果和资源对比&#xff08;VHDL&ISE&#xff09;_ise除法器ip核-CSDN博客 数…

关于C#中的HashSet<T>与List<T>

HashSet<T> 表示值的集合。这个集合的元素是无须列表&#xff0c;同时元素不能重复。由于这个集合基于散列值&#xff0c;不能通过数组下标访问。 List<T> 表示可通过索引访问的对象的强类型列表。内部是用数组保存数据&#xff0c;不是链表。元素可重复&#xf…

Istio-gateway

一. gateway 在 Kubernetes 环境中&#xff0c;Kubernetes Ingress用于配置需要在集群外部公开的服务。但是在 Istio 服务网格中&#xff0c;更好的方法是使用新的配置模型&#xff0c;即 Istio Gateway&#xff0c;Gateway 允许将 Istio 流量管理的功能应用于进入集群的流量&…

C#基础:用ClosedXML实现Excel写入

直接在控制台输出&#xff0c;确保安装了该第三方库 using ClosedXML.Excel;class DataSource {public int id { get; set; }public string name { get; set; } "";public string classes { get; set; } "";public int score { get; set; } } class Te…

深入浅出hdfs-hadoop基本介绍

一、Hadoop基本介绍 hadoop最开始是起源于Apache Nutch项目&#xff0c;这个是由Doug Cutting开发的开源网络搜索引擎&#xff0c;这个项目刚开始的目标是为了更好的做搜索引擎&#xff0c;后来Google 发表了三篇未来持续影响大数据领域的三架马车论文&#xff1a; Google Fil…

spring Cloud Stream 实战应用深度讲解

springCloudStream 简介 Spring Cloud Stream是一个框架&#xff0c;用于构建与共享消息传递系统连接的高度可扩展的事件驱动微服务。 该框架提供了一个灵活的编程模型&#xff0c;该模型建立在已经建立和熟悉的 Spring 习惯用语和最佳实践之上&#xff0c;包括对持久发布/订…

【Maven】-- 打包添加时间戳的两种方法

一、需求 在执行 mvn clean package -Dmaven.test.skiptrue 后&#xff0c;生成的 jar 包带有自定义系统时间。 二、实现 方法一&#xff1a;使用自带属性&#xff08;不推荐&#xff09; 使用系统时间戳&#xff0c;但有一个问题&#xff0c;就是默认使用 UTC0 的时区。举例…

什么叫特征分解?

特征分解&#xff08;Eigenvalue Decomposition&#xff09;是将一个方阵分解为特征向量和特征值的过程。对于一个 nn 的方阵A&#xff0c;其特征向量&#xff08;Eigenvector&#xff09;v 和特征值&#xff08;Eigenvalue&#xff09; λ 满足以下关系&#xff1a; 这可以写…