flutter之网络请求dio和json数据解析

我爱海鲸 2024-07-30 11:37:16 flutter学习

简介Dart、跨平台、dio、http

1、搭建flutter的开发环境:http://www.haijin.xyz/article/730

2、创建一个项目:

flutter create myapp

项目结构:

注意没有展开的包表示并不涉及里面的东西,所以不展开了,如:components和pages包

3、相关代码:

code_api.dart:(这部分代码是变化的,可通过业务代码来调整)

// lib/api/code_api.dart

import '../model/code_model.dart';
import '../network/api_service.dart';
import '../utils/model_util.dart';

class CodeAPI {
  final ApiService _apiService = ApiService();

  void fetchTodoData(int userId) {
    try {
      final body = {'userId': userId}; // 示例查询参数
      _apiService.get(
        url: 'https://jsonplaceholder.typicode.com/todos',
        body: body,
        callbackFunc: (dynamic data) {
          // 在这里处理数据
          final List<CodeModel> codeModels = ModelUtil.convertJsonToList<CodeModel>(data,CodeModel.fromJson);
          print(codeModels[0].id);
        },
      );
    } catch (e) {
      print('Error: $e');
    }
  }
}

code_model.dart:(这部分代码可以直接通过json to dart的插件生成)

/// userId : 1
/// id : 1
/// title : "delectus aut autem"
/// completed : false

class CodeModel {
  CodeModel({
      num? userId,
      num? id,
      String? title,
      bool? completed,}){
    _userId = userId;
    _id = id;
    _title = title;
    _completed = completed;
}

  CodeModel.fromJson(dynamic json) {
    _userId = json['userId'];
    _id = json['id'];
    _title = json['title'];
    _completed = json['completed'];
  }
  num? _userId;
  num? _id;
  String? _title;
  bool? _completed;
CodeModel copyWith({  num? userId,
  num? id,
  String? title,
  bool? completed,
}) => CodeModel(  userId: userId ?? _userId,
  id: id ?? _id,
  title: title ?? _title,
  completed: completed ?? _completed,
);
  num? get userId => _userId;
  num? get id => _id;
  String? get title => _title;
  bool? get completed => _completed;

  Map<String, dynamic> toJson() {
    final map = <String, dynamic>{};
    map['userId'] = _userId;
    map['id'] = _id;
    map['title'] = _title;
    map['completed'] = _completed;
    return map;
  }

}

api_service.dart(这部分代码是不变的,直接复制):

// lib/network/api_service.dart
import 'dart:convert';
import 'package:dio/dio.dart';

class ApiService {
  final Dio _dio = Dio();

  Future<dynamic> request({
    required String url,
    required String method,
    Map<String, dynamic>? headers,
    dynamic body,
  }) async {
    try {
      final options = Options(method: method.toUpperCase());

      if (headers != null) {
        options.headers = headers;
      }

      final response = await _dio.request(
        url,
        options: options,
        data: body,
      );


      if (response.statusCode == 200 || response.statusCode == 201) {
        return response.data;
      } else {
        throw Exception(
            'Failed to load data with status code: ${response.statusCode}');
      }
    } catch (e) {
      throw Exception('Error: $e');
    }
  }


  Future<void> get({
    required String url,
    dynamic body,
    required Function(dynamic) callbackFunc,
  }) async {
    final queryParameters = body;

    final finalUrl = '$url?${_convertQueryParameters(queryParameters)}';

    print("get请求的地址:$finalUrl");

    final data = await request(
      url: finalUrl,
      method: 'GET',
    );
    // 回调响应的数据
    callbackFunc(data);
  }


  Future<void> post({
    required String url,
    dynamic body,
    required Function(dynamic) callbackFunc,
  }) async {
    final finalBody = body ?? {};

    print("post请求的地址:$url");

    final data = await request(
      url: url,
      method: 'GET',
      body: finalBody,
    );
    // 回调响应的数据
    callbackFunc(data);
  }

  String _convertQueryParameters(Map<String, dynamic>? parameters) {
    if (parameters == null || parameters.isEmpty) {
      return "";
    }

    final List<String> queryParts = [];
    parameters.forEach((key, value) {
      // 如果值为 null,则跳过这个键值对
      if (value == null) return;

      queryParts.add('$key=${Uri.encodeComponent(value.toString())}');
    });

    return queryParts.join('&');
  }

}

model_util.dart(这部分代码是不变的,直接复制):

// lib/utils/model_util.dart
import 'dart:convert';

class ModelUtil<T> {
  // 将请求返回后的json数组数据转化为某一个实体的集合
  static List<T> convertJsonToList<T>(dynamic data, T Function(dynamic json) fromJson) {
    List<dynamic> jsonData = data;
    List<T> result = jsonData.map((v)=>fromJson(v)).toList();
    return result;
  }

// 将请求返回后的单个json对象转化为指定类型的实体对象
  static T convertJsonToObject<T>(dynamic data, T Function(dynamic json) fromJson) {
    return fromJson(data);
  }

}

这样我们就完成了网络的请求以及json数据的解析。

你好:我的2025