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

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 {
  @override
  State<ChatPage> createState() => _ChatPageState();
}
class _ChatPageState extends State<ChatPage> {
  @override
  void 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转成模型数据,最后转成List
    List 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 = [];

  @override
  void 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.kler.cn/a/395297.html

相关文章:

  • PyQt入门指南五十二 版本控制与协作开发
  • Linux系统常用操作与命令指南
  • Linux网络——网络初识
  • 如何保护 Microsoft 网络免受中间人攻击
  • 力扣662:二叉树的最大宽度
  • Llama微调测试记录
  • unity3d————插值运算补充点
  • 使用 Spring Security 实现基于角色的权限管理
  • ssm111基于MVC的舞蹈网站的设计与实现+vue(论文+源码)_kaic
  • C#笔记(3)
  • 解决Spring Boot整合Redis时的连接问题
  • 【Python · PyTorch】卷积神经网络(基础概念)
  • 长连接配置以及断线重连
  • Ubuntu 20.04配置ollama并下载安装调用本地大语言模型
  • 低光增强常用的损失函数pytorch实现
  • 「QT」高阶篇 之 d-指针 的用法
  • javascript用来干嘛的?赋予网站灵魂的语言
  • axios平替!用浏览器自带的fetch处理AJAX(兼容表单/JSON/文件上传)
  • 百度世界2024|李彦宏:智能体是AI应用的最主流形态,即将迎来爆发点
  • 应用jar包使用skywalking8(Tongweb7嵌入式p11版本 by lqw)
  • uniapp 如何使用vuex store (亲测)
  • 游戏引擎学习第二天
  • 深入理解 Spring Boot 中的 Starters
  • vue3+ant design vue实现日期等选择器点击右上角叉号默认将值变为null,此时会影响查询等操作~
  • 【C++】隐含的“This指针“
  • GIT将源码推送新分支