【FlutterDart】MVVM(Model-View-ViewModel)架构模式例子-dio版本(31 /100)

embedded/2025/1/19 2:29:30/

动图更精彩

在这里插入图片描述

dio & http

在Flutter中,dio和http是两个常用的HTTP请求库,它们各有优缺点。以下是对这两个库的详细对比:
功能特性

http:

功能:提供了基本的HTTP请求和响应功能,如GET、POST、PUT、DELETE等。
易用性:API简单,易于上手。
功能丰富度:功能相对简单,没有提供拦截器、请求取消、请求日志记录等高级功能。

dio:

功能:功能强大,支持多种高级功能,如拦截器、请求取消、请求日志记录、Cookie管理、文件上传/下载、超时设置、自定义适配器等。
易用性:API相对复杂,但提供了丰富的功能和灵活的配置。
功能丰富度:功能丰富,支持多种高级功能,适合复杂的应用场景。
使用方式
http:

import 'package:http/http.dart' as http;void httpNetwork() async {final client = http.Client();final url = Uri.parse("https://api.example.com/data");final response = await client.get(url);if (response.statusCode == 200) {print(response.body);} else {print(response.statusCode);}
}

dio:

import 'package:dio/dio.dart';void dioNetwork() async {Dio dio = Dio();final response = await dio.get("https://api.example.com/data");if (response.statusCode == 200) {print(response.data);} else {print(response.statusCode);}
}

性能比较
http:平均耗时为100ms。
dio:平均耗时为80ms,性能表现更好。
生态支持
http:
知名度:作为Flutter官方提供的库,具有很高的知名度和活跃度。
文档和社区支持:文档和社区支持完善,易于查找和学习。
dio:
知名度:也具有很高的知名度和活跃度,社区支持良好。
文档和社区支持:提供了详细的文档和示例,社区活跃度高。
结论
简单易用:如果你需要一个简单易用的HTTP请求库,可以选择http。
功能丰富:如果你需要更丰富的功能和更好的性能,可以选择dio
生态支持:http和dio在生态支持方面更加成熟,文档和社区支持完善。

代码:

// modelimport 'dart:convert';import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';class Result {String data;Result(this.data);
}//ViewModel
class DioViewModel extends ChangeNotifier {Result? _result;Result? get result => _result;bool _isLoading = false;bool get isLoading => _isLoading;Future<void> fetchDio() async {_isLoading = true;notifyListeners();var url = 'https://api.apiopen.top/api/sentences';// url = 'https://cn.bing.com/';final response = await Dio().get(url);if (response.statusCode == 200) {if (response.data is String) {_result = Result(response.data);} else {var str = json.encode(response.data);_result = Result(str);}} else {throw Exception('Failed to load user');}_isLoading = false;notifyListeners();}
}class DioMvvmDemo extends StatelessWidget {const DioMvvmDemo({super.key});Widget build(BuildContext context) {return ChangeNotifierProvider(create: (context) => DioViewModel(),child: DioMvvmView(),);}
}class DioMvvmView extends StatelessWidget {const DioMvvmView({super.key});Widget build(BuildContext context) {return Column(children: [Consumer<DioViewModel>(builder: (context, viewModel, child) {if (viewModel.isLoading) {return Center(child: CircularProgressIndicator(),);} else if (viewModel.result == null) {return Center(child: Text('result not found'));} else {return Text('result=${viewModel.result!.data}');}}),IconButton(onPressed: () {context.read<DioViewModel>().fetchDio();},icon: Icon(Icons.send))],);}
}

http://www.ppmy.cn/embedded/155109.html

相关文章

cmake foreach 条件判断

格式 foreach(<loop_var> <items>)<commands> endforeach()其中<items>是由空格或空白分隔的项目列表。foreach和匹配的endforeach之间的所有命令都被记录下来而不被调用。一旦计算完endforeach&#xff0c;将为<items>中的每个项目调用一次记录…

第三章、python中的对象、变量、标识符、作用域、引用(调用)及地址的概念(3.1-3.2)------内存地址、创建对象、对象的类型及对象的划分问题

第三章、python中的对象、变量、标识符、作用域、引用(调用)及地址的概念 本章讲述编程中对象、变量、地址的基本概念及其之间的关系,可迭代对象、可变对象、不可变对象的特点。

【ComfyUI专栏】Git Clone 下载自定义节点的代理设置

我们实际在使用ComfyUI 下载节点的时候会碰到下载缓慢的问题,这个问题如何解决呢?有没有比较好的办法解决下载和复制缓慢的问题呢?这个就涉及到我们使用代理的方式进行节点下载的方式了。首先确定我们当前的代理服务器的设置,也就是IP地址和端口问题。 开启Cmd命令,执行如…

IDEA编译器集成Maven环境以及项目的创建(2)

选择&#xff1a;“File” ---> "Othoer Setting" --> "Settings for New Projects..." --->搜索“Maven” 新建项目 利用maven命令去编译这个项目 利用maven去打包

基于 STM32 连接 Mini MP3 播放器的实践探索

在嵌入式系统开发中&#xff0c;音频播放功能常常是提升项目趣味性和实用性的关键要素之一。本文将详细阐述从选用 51 单片机到最终基于 STM32 成功连接 Mini MP3 播放器并实现串口通信及音频播放的全过程&#xff0c;旨在为面临类似技术难题的开发者提供参考与借鉴。 一、51 …

Ansible深度解析:如何精准区分并选用command与shell模块

Ansible&#xff0c;作为一个强大的自动化工具&#xff0c;提供了多种模块来执行不同的任务。其中&#xff0c;command和shell模块是最常用的两个模块&#xff0c;用于在远程主机上执行命令。然而&#xff0c;尽管它们的功能相似&#xff0c;但在使用场景和特点上存在显著的差异…

Big-endian(大端字节序)与Little-endian(小端字节序)区别

文章目录 前言字节序的定义举例说明为什么有两种字节序应用举例总结 前言 BIG_ENDIAN 和 LITTLE_ENDIAN 是两种不同的字节序&#xff08;Byte Order&#xff09;表示方式&#xff0c;用于指定数据在内存中存储的顺序。 字节序的定义 字节序指的是多字节数据类型&#xff08;如…

[Qt] Box Model | 控件样式 | 实现log_in界面

目录 1、样式属性 &#xff08;1&#xff09;盒模型&#xff08;Box Model&#xff09; 2、控件样式示例 &#xff08;1&#xff09;按钮 &#xff08;2&#xff09;复选框 &#xff08;3&#xff09;单选框 &#xff08;4&#xff09;输入框 &#xff08;5&#xff09…