Flutter (十七) 网络请求

网络请求

安装dio,在项目目录文件中执行flutter pub add dio

javascript 复制代码
import 'package:dio/dio.dart';

void main(List<String> args) {
  Dio().get("https://geek.itheima.net/v1_0/channels").then((data){
    print(data);
  });
}

项目中使用dio

vbnet 复制代码
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';

void main(List<String> args) {
  // Dio().get("https://geek.itheima.net/v1_0/channels").then((data) {
  //   print(data);
  // });
  runApp(MaterialApp(home: HomePage()));
}

class HomePage extends StatefulWidget {
  HomePage({Key? key}) : super(key: key);

  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  List _channels = [];
  @override
  void initState() {
    super.initState();
    print("initstate");
    getChannle();
  }

  void getChannle() async {
    DioUtils net = DioUtils();
    Response<dynamic> res = await net.get("channels");
    /*
    {
      "data": {
        "channels": [
          { "id": 0, "name": "推荐" },
          { "id": 1, "name": "html" },
          { "id": 2, "name": "开发者资讯" },
          { "id": 4, "name": "c++" },
          { "id": 6, "name": "css" },
          { "id": 7, "name": "数据库" },
          { "id": 8, "name": "区块链" },
          { "id": 9, "name": "go" },
          { "id": 10, "name": "产品" },
          { "id": 11, "name": "后端" },
          { "id": 12, "name": "linux" },
          { "id": 13, "name": "人工智能" },
          { "id": 14, "name": "php" },
          { "id": 15, "name": "javascript" },
          { "id": 16, "name": "架构" },
          { "id": 17, "name": "前端" },
          { "id": 18, "name": "python" },
          { "id": 19, "name": "java" },
          { "id": 20, "name": "算法" },
          { "id": 21, "name": "面试" },
          { "id": 22, "name": "科技动态" },
          { "id": 23, "name": "js" },
          { "id": 24, "name": "设计" },
          { "id": 25, "name": "数码产品" },
          { "id": 26, "name": "软件测试" }
        ]
      },
      "message": "OK"
    }
  */
    print(res.data);
    Map<String, dynamic> data = res.data as Map<String, dynamic>;
    List channels = data["data"]["channels"] as List;
    // List mapList =
    //     channels.cast<Map<String, dynamic>>() as List<Map<String, dynamic>>;
    List mapList = channels.cast<Map<String, dynamic>>();
    setState(() {
      _channels = mapList;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("Dio学习")),
      body: GridView.extent(
        maxCrossAxisExtent: 100,
        children: List.generate(_channels.length, (index) {
          return Text(_channels[index]["name"]);
        }),
      ),
    );
    // return Container(child: GridView.builder(gridDelegate: gridDelegate, itemBuilder: itemBuilder));
  }
}

class DioUtils {
  final Dio _dio = Dio();
  DioUtils() {
    // _dio.options.baseUrl = "https://geek.itheima.net/v1_0/channels";
    // _dio.options.connectTimeout = Duration(seconds: 10);
    // _dio.options.sendTimeout = Duration(seconds: 10);
    // _dio.options.receiveTimeout = Duration(seconds: 10);

    _dio.options
      ..baseUrl = "https://geek.itheima.net/v1_0/"
      ..connectTimeout = Duration(seconds: 10)
      // ..sendTimeout = Duration(seconds: 10)
      ..receiveTimeout = Duration(seconds: 10);

    _addIntercepter();
  }

  void _addIntercepter() {
    _dio.interceptors.add(
      InterceptorsWrapper(
        onRequest: (context, handle) {
          handle.next(context);

          // handle.reject(Error);
        },
        onResponse: (context, handle) {
          if (context.statusCode! == 200) {
            handle.next(context);
            return;
          }
          handle.reject(DioException(requestOptions: context.requestOptions));
        },
        onError: (context, handle) {
          handle.reject(context);
        },
      ),
    );
  }

  Future<Response<dynamic>> get(String url, {Map<String, dynamic>? params}) {
    return _dio.get(url, queryParameters: params);
  }
}
相关推荐
不停喝水2 分钟前
【前端转全栈java速通课】 项目实战④12-14节 拦截器过滤器和全局配置-cors跨域设置-token体系-利用session做验证码
java·开发语言·前端·ai·容器
代码猎人6 分钟前
怎么开发一个微信小程序
前端
console.log('npc')9 分钟前
第 3 章 工程化与项目初始化
前端·人工智能·大模型
掘金者阿豪14 分钟前
数据集成软件不能只看“同步成功”:聊聊金仓 KFS 和订单数据同步这件事
前端·后端
风骏时光牛马16 分钟前
Navicat Premium 18 自动续试用天数
前端
hunterandroid33 分钟前
HarmonyOS HUKS 密钥全生命周期实战:生成、轮换与失效处理
前端·华为
东鹏特饮42 分钟前
贪吃蛇小游戏html
前端·javascript·html
溪语流沙44 分钟前
【每天一个CSS | Day23】边框上有一道光在跑的流光呼吸卡片
前端·css
小马不起床1 小时前
零基础玩转 FastAPI_10:前端登录、权限与布局
前端·状态模式·fastapi
程序员Sunday1 小时前
JavaScript 深拷贝和浅拷贝有什么区别?structuredClone 能替代 JSON 拷贝吗?
前端·javascript