flutter项目初始化

flutter项目初始化

    • 0、flutter 官方插件网址
    • 1、flutter项目环境配置
    • 2、flutter数据本地存储(shared_preferences)
    • 3、GetX 中的数据响应式配合本地存储使用
    • 4、Dio 封装使用详解
    • 5、EasyLoading的使用
    • 6、缓存 keep-alive使用(除了Tabbar,其它的页面、组件都可以使用)
    • 7、缓存 tabbar(补充6的缓存 - bottomNavigationBar)
    • 8、tabbar的使用
    • 9、GetX中的路由管理
    • 10、判断组件是否被卸载掉
    • 11、flutter中静态图片的配置
    • 12、字体使用
    • 13、GetX中controller、binding管理状态
    • 14、GetX中 defaultDialog、snackbar、bottomSheet(使用Shape设置了圆角) 使用
    • 15、GetX 国际化
    • 16、系统自带的dialog框

0、flutter 官方插件网址

flutter官方链接
数据模型转换

注意:使用 flutter 的时候一定要把数据放在父组件中(主要是指Dio数据请求),往子组件传展示

1、flutter项目环境配置

待做

2、flutter数据本地存储(shared_preferences)

1、dependencies:
shared_preferences: ^2.2.2

2、utils 包里面创建文件:
shared_preferences.dart

import 'dart:convert';import 'package:shared_preferences/shared_preferences.dart';class JSpUtil {JSpUtil._internal();factory JSpUtil() => _instance;static final JSpUtil _instance = JSpUtil._internal();static late SharedPreferences _preferences;static Future<JSpUtil> getInstance() async {_preferences = await SharedPreferences.getInstance();return _instance;}/// 通用设置持久化数据static setLocalStorage<T>(String key, T value) {String type = value.runtimeType.toString();switch (type) {case "String":_preferences.setString(key, value as String);break;case "int":_preferences.setInt(key, value as int);break;case "bool":_preferences.setBool(key, value as bool);break;case "double":_preferences.setDouble(key, value as double);break;case "List<String>":_preferences.setStringList(key, value as List<String>);break;}}/// 获取持久化数据static dynamic getLocalStorage<T>(String key) {dynamic value = _preferences.get(key);if (value.runtimeType.toString() == "String") {if (_isJson(value)) {return json.decode(value);}}return value;}/// 获取持久化数据中所有存入的keystatic Set<String> getKeys() {return _preferences.getKeys();}/// 获取持久化数据中是否包含某个keystatic bool containsKey(String key) {return _preferences.containsKey(key);}/// 删除持久化数据中某个keystatic Future<bool> remove(String key) async {return await _preferences.remove(key);}/// 清除所有持久化数据static Future<bool> clear() async {return await _preferences.clear();}/// 重新加载所有数据,仅重载运行时static Future<void> reload() async {return await _preferences.reload();}/// 判断是否是json字符串static _isJson(String value) {try {const JsonDecoder().convert(value);return true;} catch(e) {return false;}}   
}

3、入口函数加上两句话,不然报错

void main() async {// 下面两句是持久化数据用的WidgetsFlutterBinding.ensureInitialized();await JSpUtil.getInstance();runApp(const ApplicationApp());
} 

4、使用

// 1、取值
JSpUtil.getLocalStorage('token');// 2、存值
JSpUtil.setLocalStorage("token", "需要存的值");

3、GetX 中的数据响应式配合本地存储使用

1、创建 store 仓库

// 根目录下创建 store/store.dart 文件// store.dart 文件里面
import 'package:get/get.dart';
import 'package:hook_up_rant/utils/shared_preferences.dart';class StoreIndex {// 变量(首先从本地储存取,没有的话就定义一个) static var token = JSpUtil.getLocalStorage("token").toString() == "null" ? "".obs :  (JSpUtil.getLocalStorage("token").toString()).obs;static void updateToken(String str) {// 改变状态token.value = str;// 同时持久化到本地存储JSpUtil.setLocalStorage("token", str);}
}

2、使用

// 存储数据并且持久化
StoreIndex.updateToken('存储的数据');// 取出数据
StoreIndex.token.value;
// 在页面上渲染需要使用 Obx(() => Container()) 包裹, 使数据具有响应式

4、Dio 封装使用详解

1、安装 Dio

dio: ^4.0.0

2、封装 Dio

// 在 utils 包里面创建 http 目录
// 然后创建四个文件// 1、 http_request.dart 核心文件
import 'package:dio/dio.dart';
import 'package:hook_up_rant/utils/http/http_interceptor.dart';
import 'package:hook_up_rant/utils/http/http_options.dart';// http 请求单例类
class HttpRequest {// 工厂构造方法factory HttpRequest() => _instance;// 初始化一个单例实例static final HttpRequest _instance = HttpRequest._internal();// dio 实例Dio? dio;// 内部构造方法HttpRequest._internal() {if (dio == null) {// BaseOptions、Options、RequestOptions 都可以配置参数,优先级别依次递增,且可以根据优先级别覆盖参数BaseOptions baseOptions = BaseOptions(baseUrl: HttpOptions.BASE_URL,connectTimeout: HttpOptions.CONNECT_TIMEOUT,receiveTimeout: HttpOptions.RECEIVE_TIMEOUT,headers: {},);// 没有实例 则创建之dio = Dio(baseOptions);// 添加拦截器dio!.interceptors.add(HttpInterceptor());// 打印日志// dio!.interceptors.add(LogInterceptor(responseBody: true));}}/// 初始化公共属性 如果需要覆盖原配置项 就调用它////// [baseUrl] 地址前缀/// [connectTimeout] 连接超时赶时间/// [receiveTimeout] 接收超时赶时间/// [headers] 请求头/// [interceptors] 基础拦截器// void init({ String? baseUrl, int? connectTimeout, int? receiveTimeout, Map<String, dynamic>? headers, List<Interceptor>? interceptors }) {//     print("许潇111 --- $baseUrl  --   $connectTimeout  ---   $receiveTimeout  --- $headers  --  $interceptors");//     dio!.options.baseUrl = baseUrl ?? "";//     dio!.options.connectTimeout = connectTimeout ?? 10000;//     dio!.options.receiveTimeout = receiveTimeout ?? 10000;//     dio!.options.headers = headers;//     if (interceptors != null && interceptors.isNotEmpty) {//         dio!.interceptors.addAll(interceptors);//     }// }/// 设置请求头void setHeaders(Map<String, dynamic> headers) {dio!.options.headers.addAll(headers);}final CancelToken _cancelToken = CancelToken();/** 取消请求** 同一个cancel token 可以用于多个请求* 当一个cancel token取消时,所有使用该cancel token的请求都会被取消。* 所以参数可选*/void cancelRequests({CancelToken? token}) {token ?? _cancelToken.cancel("cancelled");}/// GETFuture get(String path, {Map<String, dynamic>? params, Options? options, CancelToken? cancelToken, ProgressCallback? onReceiveProgress}) async {Response response = await dio!.get(path,queryParameters: params,options: options,cancelToken: cancelToken ?? _cancelToken,onReceiveProgress: onReceiveProgress);return response.data;}/// POSTFuture post(String path, { Map<String, dynamic>? params, Options? options, CancelToken? cancelToken, ProgressCallback? onSendProgress, ProgressCallback? onReceiveProgress}) async {Response response = await dio!.post(path,data: params,options: options,cancelToken: cancelToken ?? _cancelToken,onSendProgress: onSendProgress,onReceiveProgress: onReceiveProgress);return response.data;}/// 文件上传Future postFormData(String path, { Map<String, dynamic>? params, 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/602178.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RFID传感器|识读器CNS-RFID-01/1S在AGV小车|搬运机器人领域的安装与配置方法

AGV 在运行时候需要根据预设地标点来执行指令&#xff0c;在需要 AGV 在路径线上位置执行某个指令时候&#xff0c;则需要在这个点设置 命令地标点&#xff0c;AGV 通过读取不同地标点编号信息&#xff0c;来执行规定的指令。读取地标点设备为寻址传感器&#xff0c;目前&#…

【C语言:可变参数列表】

文章目录 1.什么是可变参数列表2.可变参数列表的分析与使用2.1使用2.2分析原理2.3分析原码 1.什么是可变参数列表 对于一般的函数而言&#xff0c;参数列表都是固定的&#xff0c;而且各个参数之间用逗号进行分开。这种函数在调用的时候&#xff0c;必须严格按照参数列表中参数…

【Vue3+React18+TS4】1-1 : 课程介绍与学习指南

本书目录&#xff1a;点击进入 一、为什么做这样一门课程? 二、本门课的亮点有哪些? 2.1、轻松驾驭 2.2、体系系统 2.3、高效快捷 2.4、融合贯通 三、课程内容包括哪些? 四、项目实战 《在线考勤系统》 五、课适合哪些同学? 一、为什么做这样一门课程? 近十年内前端…

mysql常见问题

批量导入SQL 数据库结构 数据时&#xff0c;如果数据是批量插入的话会报错&#xff1a;2006 - MySQL server has gone away。 解决办法&#xff1a;找到你的 mysql 目录下的 my.ini 配置文件&#xff0c;加入以下代码 max_allowed_packet500M wait_timeout288000 interactiv…

git使用(完整流程)

1. 新建仓库 1.右击 git bash 后 输入 git init (仓库为:当前目录) git init name (仓库为:name文件夹) git clone https://github.com/Winnie996/calculate.git //https2.工作区域 工作目录 3. 添加 提交 git add . //工作区添加至暂存区 git commit -m "注释内容&q…

电脑常见蓝屏代码及含义

小编经过一年多的桌面终端运维经验和网络资料收集整理&#xff0c;现将相关代码及其含义分析出来&#xff0c;供大家参考&#xff0c;不足之处请批评指正&#xff01; 0X00000000 作业亮成 0X00000001 不正确的函数 0X00000002 系统找不到指定的档案 0X00000003 系统找不到…

Android14之Selinux解决neverallow报错(一百七十六)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

Github数据库集群的升级部署思路

Github 花了一年多的时间&#xff0c;将他们的 1200 台 MySQL 集群从 v5.6 升级到了 v8.0&#xff0c;这里的难度非常之大&#xff0c;没做过大规模集群服务器运维的难以理解此中的难度、难以理解其中庞大的业务量&#xff0c;难以想象升级过程中的海量问题的解决等等。 Githu…

Kafka消息阻塞:拯救面试的八大终极解决方案!

大家好&#xff0c;我是小米&#xff0c;一个对技术充满热情的90后程序员。最近在准备社招面试的过程中&#xff0c;遇到了一个超级有挑战性的问题&#xff1a;“Kafka消息阻塞怎么解决&#xff1f;”今天&#xff0c;我就来和大家一起深入剖析这个问题&#xff0c;分享我在解决…

C#-特性

C# 程序中的类型、成员和其他实体都支持修饰符,这些修饰符控制它们的行为的某些方面。 例如,方法的可访问性是使用 public、protected、internal 和 private 修饰符来控制的。C# 使此功能一般化,以便能够将用户定义类型的声明信息附加到程序实体,并在运行时检索。 这种附加…

kubernetes(k8s)集群常用指令

基础控制指令 # 查看对应资源: 状态 $ kubectl get <SOURCE_NAME> -n <NAMESPACE> -o wide 查看默认命名空间的pod [rootk8s-master ~]# kubectl get pod NAME READY STATUS RESTARTS AGE nginx 1/1 Running 0 3h53m查看所有pod [roo…

Vue3-36-路由-路由的元数据信息 meta

什么是 meta 简单的理解&#xff0c;meta 就是路由对象 的一个属性对象&#xff0c; 可以 通过这个 属性给 路由对象添加 一些必要的属性值&#xff0c; 在使用路由对象时可以获取到这个属性型对象&#xff0c;从而进行一些其他的逻辑判断。 meta 这个非常的简单&#xff0c;就…

这几个自学前端/编程的苦,你千万不要吃

作为一个靠自学&#xff0c;不到两年时间就当上前端 Leader&#xff0c;年薪近 30w 的过来人&#xff0c; 今天我给你们分享一些前端自学路上&#xff0c;你会吃的苦&#xff0c;以及如何避免和解决。 这些让你吃苦的地方&#xff0c;是造成你前端学不好、并且学不下去的根本…

深入了解ReadDirectoryChangesW并应用其监控文件目录

简介 监视指定目录的更改&#xff0c;并将有关更改的信息打印到控制台&#xff0c;该功能的实现不仅可以在内核层&#xff0c;在应用层同样可以。程序中使用 ReadDirectoryChangesW 函数来监视目录中的更改&#xff0c;并使用 FILE_NOTIFY_INFORMATION 结构来获取有关更改的信息…

BERT(从理论到实践): Bidirectional Encoder Representations from Transformers【1】

预训练模型:A pre-trained model is a saved network that was previously trained on a large dataset, typically on a large-scale image-classification task. You either use the pretrained model as is or use transfer learning to customize this model to a given t…

Nacos vs. Eureka:微服务注册中心的对比

Nacos vs. Eureka&#xff1a;微服务注册中心的对比 前言: 欢迎来到本篇博客&#xff0c;今天我们将深入研究两个常用的微服务注册中心&#xff1a;Nacos 和 Eureka。微服务架构的兴起使得服务注册中心成为整个体系中不可或缺的一部分&#xff0c;而选择一个适合自己项目的注…

Python中的装饰器

顾名思义&#xff0c;函数装饰器就是对这个函数进行了装饰&#xff0c;比如在函数的前后进行日志打印等。在Python中&#xff0c;装饰器是一种特殊的语法&#xff0c;用于简化函数或方法的定义和调用。装饰器允许你在不修改原始函数代码的情况下&#xff0c;通过在其上应用装饰…

Apple M2 Pro芯片 + docker-compose up + mysql、elasticsearch pull失败问题的解法

背景 &#xff08;1&#xff09;从github上git clone了一个基于Spring Boot的Java项目&#xff0c;查看readme&#xff0c;发现要在项目的根目录下&#xff0c;执行“docker-compose up”。&#xff08;2&#xff09;执行“docker-compose up”的前提是&#xff0c;在macos上要…

Vue中break关键字

Change() {//每次触发该事件&#xff0c;都要讲data重新赋值一次this.data JSON.parse(JSON.stringify(this.data1));// 根据选中的等级更新数据switch (this.selectedlevel) {case 1:// 更新数据为一级数据this.data this.data.filter(item > item.level "1"…

练习-双指针的使用

目录 前言一、双指针遍历数组1.1 题目一 总结 前言 最近感觉有点疲倦&#xff0c;学习的时间不多&#xff0c;但不想中断写博客的连续&#xff0c;本篇文章就记录一下在写c语言练习过程中利用双指针解题。 一、双指针遍历数组 1.1 题目一 题目&#xff1a;将一个数组中的奇数…