当前位置: 首页 > news >正文

Flutter:使用Future发送网络请求

pubspec.yaml配置http的SDK

cupertino_icons: ^1.0.8
http: ^1.2.2

请求数据的格式转换

// Map 转 json
final chat = {'name': '张三','message': '吃饭了吗',
};
final chatJson = json.encode(chat);
print(chatJson);// json转Map
final newChat = json.decode(chatJson);
print(newChat);

发送请求

import 'dart:convert'; // json依赖
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http; // http请求依赖class Chat {final String? name;final String? message;final String? imageUrl;Chat({this.name, this.message, this.imageUrl});//factory Chat.formMap(Map map) {return Chat(name: map['name'],message: map['message'],imageUrl: map['imageUrl'],);}
}class ChatPage extends StatefulWidget {@overrideState<ChatPage> createState() => _ChatPageState();
}
class _ChatPageState extends State<ChatPage> {@overridevoid initState() {super.initState();getDatas().then((value) {}).catchError((onError) {}).whenComplete(() {print('数据加载完毕');}).timeout(Duration(seconds: 1)).catchError((err) {print('超时时长1秒,提示请求超时');});}
}// async:异步的请求,不用卡在这等待
Future<List> getDatas() async {final url =Uri.parse('http://rap2api.taobao.org/app/mock/321326/api/chat/list');final res = await http.get(url);if (res.statusCode == 200) {// 获取相应数据,转成Map类型final resBody = json.decode(res.body);// map遍历chat_list,把每一项item转成模型数据,最后转成ListList chatList =resBody['chat_list'].map((item) => Chat.formMap(item)).toList();return chatList;} else {throw Exception('statusCode:${res.statusCode}');}
}

FutureBuilder 发送的请求

return Scaffold(body: Container(child: FutureBuilder(future: getDatas(),builder: (BuildContext context, AsyncSnapshot snapshot) {print('data:${snapshot.data}');if (snapshot.connectionState == ConnectionState.waiting) {return const Center(child: Text('Loading...'),);}return ListView(children: snapshot.data.map<Widget>((item) {return ListTile(title: Text(item.name),subtitle: Container(alignment: Alignment.bottomCenter,height: 25,child: Text(item.message,overflow: TextOverflow.ellipsis,),),leading: Container(width: 44,height: 44,decoration: BoxDecoration(borderRadius: BorderRadius.circular(6.0),image: DecorationImage(image: NetworkImage(item.imageUrl))),));}).toList(),);}),)
);

在这里插入图片描述

声明变量接收接口数据,在页面中使用该变量去渲染页面的方式

class _ChatPageState extends State<ChatPage> {List _datas = [];@overridevoid initState() {super.initState();getDatas().then((value) {setState(() {_datas = value;});}).catchError((onError) {});}
}body: Container(child: Container(child: _datas.length == 0 ? Center(child: Text('Loading...')) : ListView.builder(itemCount: _datas.length,itemBuilder: (BuildContext context, int index) {return ListTile(title: Text(_datas[index].name),subtitle: Container(alignment: Alignment.bottomCenter,height: 25,child: Text(_datas[index].message,overflow: TextOverflow.ellipsis,),),leading: Container(width: 44,height: 44,decoration: BoxDecoration(borderRadius: BorderRadius.circular(6.0),image: DecorationImage(image: NetworkImage(_datas[index].imageUrl))),));},))
)
http://www.lryc.cn/news/484596.html

相关文章:

  • 4000字浅谈Java网络编程
  • 立体工业相机提升工业自动化中的立体深度感知
  • 大模型基础BERT——Transformers的双向编码器表示
  • 怎么禁止Ubuntu自动更新升级
  • 【SpringBoot】20 同步调用、异步调用、异步回调
  • 【Excel】数据透视表分析方法大全
  • 深度学习在边缘检测中的应用及代码分析
  • k8s 1.28.2 集群部署 docker registry 接入 MinIO 存储
  • 常用的生物医药专利查询数据库及网站(很全!)
  • 「QT」几何数据类 之 QPolygon 多边形类
  • 写给初学者的React Native 全栈开发实战班
  • 工作和学习遇到的技术问题
  • 如何解决JAVA程序通过obloader并发导数导致系统夯住的问题 | OceanBase 运维实践
  • Git零基础到入门
  • HTTP 1.0、HTTP 1.1 和 HTTP 2.0 区别
  • 解决 ElSelect 数据量大导致加载速度慢
  • 在 CentOS 系统中,您可以使用多种工具来查看网络速度和流量
  • 分布式----Ceph部署
  • 使用 PyTorch 实现 AlexNet 进行 MNIST 图像分类
  • Python爬虫项目 | 一、网易云音乐热歌榜歌曲
  • 【Linux】HTTP协议和HTTPS加密
  • Linux编辑/etc/fstab文件不当,不使用快照;进入救援模式
  • ubuntu升级postgres
  • vue2在el-dialog打开的时候使该el-dialog中的某个输入框获得焦点方法总结
  • SpringBoot(十七)创建多模块Springboot项目
  • Vue.js 高质量翻页功能的完整开发指南
  • android dvr黑屏
  • css文字间距撑满横向距离
  • 【Unity基础】对比OnCollisionEnter与OnTriggerEnter
  • 算法训练(leetcode)二刷第二十五天 | *134. 加油站、*135. 分发糖果、860. 柠檬水找零、*406. 根据身高重建队列