Flutter Riverpod状态管理之AutoDisposeNotifierProvider

Flutter Riverpod状态管理之AutoDisposeNotifierProvider

Flutter的Riverpod状态管理,目前来看是官方出的最好用的状态管理库了,今天我们主要看AutoDisposeNotifierProvider的使用,AutoDisposeNotifierProvider具有如下的优势:
1、自动释放资源:
AutoDisposeNotifierProvider会在Provider不被任何Widget监听时,自动释放其状态和资源,这对于需要管理大量资源的应用(如网络请求、数据库连接等)特别有用。
2、防止内存泄漏:
通过自动释放不再需要的状态,可以有效防止内存泄漏。
3、简化代码:
不需要手动管理Provider的生命周期,减少了样板代码,使代码更加简洁和易维护。
4、提高性能:
通过即使释放不再需要的资源,可以提高应用的性能,确保资源高效利用。

一、依赖库:

需要在pubspec.yaml中添加如下依赖:

dependencies:# 官方最新状态管理库flutter_riverpod: ^2.4.9# 通过注解(annotations)简化了Provider的定义,并与riverpod_generator配合使用,实现代码的自动生成。riverpod_annotation: ^2.3.3
dev_dependencies:# 可以自动生成各种类型的Provider,从而减少手动编写Provider的工作量。riverpod_generator: ^2.3.9# 用于代码生成,通过解析源代码并生成新的代码文件,帮助开发者自动生成重复性代码,从而提高开发效率,如序列化/反序列化、依赖注入、路由管理等。# 指令: flutter pub run build_runner buildbuild_runner: ^2.4.7

添加完需要拉取下依赖: flutter pub get flutter pub upgrade

二、定义数据模型类:

RiverPodPage4Logic源码
通过注释中的6步骤,定义数据模型类,并准备生成对应xxx.g.dart文件

import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:startup_namer/util/print_util.dart';part 'riverpod_page4_logic.g.dart';///1、首先定义RiverPodPage4Logic类,并继承_$RiverPodPage4Logic
///2、添加注解@riverpod
///3、定义ViewModel类RiverPodPage4ViewModel
///4、覆写build方法,并返回RiverPodPage4ViewModel实例
///5、顶部添加:part 'riverpod_page4_logic.g.dart';
///6、终端执行指令:flutter pub run build_runner build

class RiverPodPage4Logic extends _$RiverPodPage4Logic {RiverPodPage4ViewModel build() {requestRemoteData();return RiverPodPage4ViewModel();}///模拟网络请求void requestRemoteData() {Future.delayed(const Duration(milliseconds: 2000), () {PrintUtil.print("request finished");String data = "remote data";//更新数据state = state.copyWith(data);});}
}class RiverPodPage4ViewModel {String data = "";RiverPodPage4ViewModel();RiverPodPage4ViewModel copyWith(String? data) {return RiverPodPage4ViewModel()..data = data ?? this.data;}
}

该类对应的dart文件名为:riverpod_page4_logic.dart

三、脚本生成xxx.g.dart类:

riverpod_page4_logic.g.dart源码
通过执行终端指令:

flutter pub run build_runner build
自动生成对应xxx.g.dart类,具体为:riverpod_page4_logic.g.dart

// GENERATED CODE - DO NOT MODIFY BY HANDpart of 'riverpod_page4_logic.dart';// **************************************************************************
// RiverpodGenerator
// **************************************************************************String _$riverPodPage4LogicHash() =>r'932c10533d58e940dac007c45624c7d0a8c5da06';/// See also [RiverPodPage4Logic].
(RiverPodPage4Logic)
final riverPodPage4LogicProvider = AutoDisposeNotifierProvider<RiverPodPage4Logic, RiverPodPage4ViewModel>.internal(RiverPodPage4Logic.new,name: r'riverPodPage4LogicProvider',debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')? null: _$riverPodPage4LogicHash,dependencies: null,allTransitiveDependencies: null,
);typedef _$RiverPodPage4Logic = AutoDisposeNotifier<RiverPodPage4ViewModel>;
// ignore_for_file: type=lint
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member

以上类为自动模板生成,不需要任何修改。

四、具体调用:

RiverPodPage4源码
在组件build方法中调用:
1、通过ref.watch来进行数据监听、更新;
2、通过ref.read来进行数据读取/notifier中方法调用;
3、当然也可以使用ref.listen来只做监听,不常用,这里不再过多介绍。

import 'package:flutter/material.dart';
import 'package:flutter/src/widgets/framework.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:startup_namer/base/common_base_state.dart';
import 'package:startup_namer/logic/riverpod_page4_logic.dart';///RiverPod状态管理页 --- 【AutoDisposeNotifierProvider】
class RiverPodPage4 extends ConsumerStatefulWidget {const RiverPodPage4({super.key});ConsumerState<ConsumerStatefulWidget> createState() => _RiverPodPage4State();
}class _RiverPodPage4State extends CommonPageState<RiverPodPage4> {bool isRed = false;Widget buildPageContent(BuildContext context) {///通过ref.watch监听data,当接口数据请求成功后,会自动刷新build方法,更细UI。String data = ref.watch(riverPodPage4LogicProvider).data;///通过ref.watch监听isRed变量,当通过如下点击方法更新Model中其值时,由于这里使用了watch方法,也会自动更新build方法,刷新UI展示。isRed = ref.watch(riverPodPage4LogicProvider).isRed;return GestureDetector(onTap: () {///通过ref.read方法读取notifier,并通过内部updateBgColor方法更新其值ref.read(riverPodPage4LogicProvider.notifier).updateBgColor(!isRed);},child: Container(alignment: Alignment.center,///展示背景值decoration: BoxDecoration(color: isRed ? Colors.red : Colors.white),///展示数据child: Text("show Data:$data isRed:$isRed",style: const TextStyle(fontWeight: FontWeight.w700, fontSize: 16),),),);}
}

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

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

相关文章

day39(8/29)——harbor私有仓库管理

一、harbor私有仓库管理 是python的包管理工具&#xff0c;和yum对redhat的关系是一样的 yum -y install epel-release yum -y install python2-pip pip install --upgrade pip pip list pip 8x pip install --upgrade pip pip install --upgrade pip20.3 -i https://mirror…

RFID光触发标签在文件柜管理中的创新应用

在当今信息化时代&#xff0c;文件管理对于企业和机构的重要性不言而喻。传统的文件柜管理方式存在诸多问题&#xff0c;如查找文件困难、管理效率低下、安全性难以保障等。而 RFID 光触发标签技术的出现&#xff0c;为文件柜管理带来了全新的解决方案。 一、传统文件柜管理的…

高效学习的方式

一、如何确定一个知识点是否值得投入学习&#xff1f; 1、目标对齐&#xff1a;考虑这个知识点是否与你的个人目标、职业发展或兴趣爱好相符。 2、需求分析&#xff1a;分析当前市场或学术界对这个知识点的需求&#xff0c;是否具有普遍性和紧迫性。 3、资源可用性&#xff…

Spring扩展点系列-@PostConstruct

简介 spring的Bean在创建的时候会进行初始化&#xff0c;而初始化过程会解析出PostConstruct注解的方法&#xff0c;并反射调用该方法。 PostConstruct 的使用和特点 只有一个非静态方法能使用此注解&#xff1b;被注解的方法不得有任何参数&#xff1b;被注解的方法返回值必…

行为型设计模式-中介者(mediator)模式-python实现

设计模式汇总&#xff1a;查看 通俗示例 想象一下你正在参与一个团队项目&#xff0c;团队成员包括设计师、前端开发者、后端开发者、测试工程师等。每个团队成员都需要与其他成员沟通协作&#xff0c;比如设计师完成设计后需要通知前端开发者开始开发&#xff0c;前端开发者完…

实际开发中git在IDEA中的使用

相信搜索这个的同学代码都已经拉取到本地了&#xff0c;并且已经在idea中打开了。 1.一般我们从远程colone下来的代码默认是在主分支下的&#xff0c;也就是说我们从远程的主分支拉取的代码并且在本地创建了一个主分支。 2.一般主分支是不允许修改的&#xff0c;所以我们可以基…

Logistic分类算法原理及Python实践

一、Logistic分类算法原理 Logistic分类算法&#xff0c;也称为逻辑回归&#xff08;Logistic Regression&#xff09;&#xff0c;是机器学习中的一种经典分类算法&#xff0c;主要用于解决二分类问题。其原理基于线性回归和逻辑函数&#xff08;Sigmoid函数&#xff09;的组…

SpringBoot2:配置绑定与自动配置功能源码解读

一、配置绑定 1、作用说明 我们在开发springboot项目时&#xff0c;会有个配置文件&#xff0c;application.properties文件。 我们知道&#xff0c;像什么访问端口、上传功能的相关配置&#xff0c;都会在这里进行配置。 而这些&#xff0c;都是springboot自带的或者第三方j…

Linux | 匿名管道和命名管道:进程间通信数据流的桥梁

目录 1、进程间通信目的 2、管道——匿名管道和命名管道 匿名管道 匿名管道的示例代码&#xff1a;将数据写入管道、子进程从管道读取数据并将其输出到bash中 父子进程通过匿名管道建立通信 重点&#xff1a;管道的五个特点 命名管道&#xff08;也称为FIFO&#xff09;…

每日一题,零基础入门FPGA——工程师在线精讲,直播预告

题目传送门&#xff1a;F学社 zzfpga.com/StudentPlatform/Sheet/QuestionBankhttp://zzfpga.com/StudentPlatform/Sheet/QuestionBank 【第Ⅰ期题目 * 5】 请使用D触发器和必要的逻辑门实现此同步时序电路&#xff0c;用Verilog语言描述。 【第Ⅰ期题目 * 4】 请设计一个0…

观测云核心技术揭秘:基于时间的半结构化数据模型

前言 众所周知&#xff0c;真正意义上的统一监控观测平台本质上是一个超大的数据湖&#xff0c;其存储了大量的来自监控指标&#xff0c;各种各样的日志&#xff0c;各种各样的链路追踪以及包括用户访问行为等海量的可观测性数据。 这些海量数据有什么特点呢&#xff1f; 首先…

【网络安全】逻辑漏洞:绕过应用程序重要功能

未经许可,不得转载。 文章目录 正文漏洞影响正文 目标:xxx.com 一个流行的汽车平台,允许用户为经销商留下评论。该平台有一个功能,用户可以点赞评论,并且它限制每个用户对每个评论只能点赞一次。 然而,我找到了绕过的方法(并不是并发)。 在点击“点赞”按钮时拦截请…

新手指南 | 研发人员奖金激励方案步骤实操

研发团队是一个非常独特的存在。在研发人员的薪酬、激励方案设计上也是很多HR的痛点。 毕竟工作变化大&#xff0c;职责变化快、个体能力差异大、投入了不一定会有产出、多线程并行&#xff0c;贡献难判定、知识密度高&#xff0c;价值难衡量等等... 基于以上难点&#xff0c…

【系统架构设计】嵌入式系统设计(1)

【系统架构设计】嵌入式系统设计&#xff08;1&#xff09; 嵌入式系统概论嵌入式系统的组成硬件嵌入式处理器总线存储器I/O 设备与接口 软件 嵌入式开发平台与调试环境交叉平台开发环境交叉编译环境调试 嵌入式系统概论 嵌入性、专用性、计算机系统是嵌入式系统的三个基本的核…

0基础轻松玩转.NET Web API 8.0【CICD】项目实战

1.背景 最近在学习CI/CD&#xff0c;为了加快熟悉CI/CD&#xff0c;我实操了下基于.Net 8.0的CI/CD项目实战。Ci/CD就是自动化作业&#xff0c;实现项目自动编译、发布、执行等&#xff0c;也有用于拉取推送数据的场景。本文主要介绍了在win 11下搭建CI/CD&#xff0c;实现自动…

UEFI——PCD的简单使用

一、PCD的定义及概念 在UEFI固件接口中&#xff0c;PCD&#xff08;Platform Configuration Database&#xff09;是一个用于存储和访问平台特定配置信息的机制。PCD允许UEFI驱动程序和应用程序在运行时获取和设置平台相关的参数&#xff0c;而无需硬编码这些值。PCD变量可以被…

加速电商物流效率:推荐几款实用的快递批量查询工具

做电商必不可少的快递批量查询平台分享&#xff1a;固乔快递查询助手使用全攻略 在电商行业日益竞争的今天&#xff0c;高效管理物流信息成为了商家们不可或缺的一环。面对每天成百上千的订单和快递单号&#xff0c;如何快速、准确地查询并跟踪物流状态&#xff0c;成为了电商…

mysql高可用之组复制

MySQL Group Replication( 简称 MGR ) 是 MySQL 官方于 2016 年 12 月推出的一个全新的高可用与高扩展的解决方案组复制是 MySQL 5.7.17 版本出现的新特性&#xff0c;它提供了高可用、高扩展、高可靠的 MySQL 集群服务MySQL 组复制分单主模式和多主模式&#xff0c;传统的…

请解释Java中的装箱拆箱操作对性能的影响,并讨论其最佳实践。什么是Java中的值传递和引用传递?它们在函数调用中的表现有何不同?

请解释Java中的装箱拆箱操作对性能的影响&#xff0c;并讨论其最佳实践。 在Java中&#xff0c;装箱&#xff08;Boxing&#xff09;和拆箱&#xff08;Unboxing&#xff09;操作是Java自动类型转换机制的一部分&#xff0c;主要用于基本数据类型&#xff08;如int, double, c…

stun和trun

在 WebRTC 中&#xff0c;STUN&#xff08;Session Traversal Utilities for NAT&#xff09;和 TURN&#xff08;Traversal Using Relays around NAT&#xff09;是用于NAT穿透的两种不同的技术&#xff0c;它们解决的问题不同&#xff0c;因此在某些情况下需要同时使用。 ST…