当前位置: 首页 > article >正文

使用 Provider 和 GetX 实现 Flutter 局部刷新的几个示例

1. 使用 Provider 实现局部刷新

示例 1:ChangeNotifier + Consumer

通过 ChangeNotifierConsumer 实现局部刷新。

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';void main() {runApp(ChangeNotifierProvider(create: (_) => CounterProvider(),child: MyApp(),),);
}class CounterProvider extends ChangeNotifier {int _counter = 0;int get counter => _counter;void increment() {_counter++;notifyListeners(); // 通知监听者刷新}
}class MyApp extends StatelessWidget {Widget build(BuildContext context) {return MaterialApp(home: Scaffold(appBar: AppBar(title: Text('Provider 局部刷新')),body: Column(children: [Consumer<CounterProvider>(builder: (context, counterProvider, child) {return Text('计数器值: ${counterProvider.counter}');},),ElevatedButton(onPressed: () {context.read<CounterProvider>().increment();},child: Text('增加计数'),),],),),);}
}
示例 2:Provider + select

通过 select 方法监听特定状态的变化,避免不必要的刷新。

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';void main() {runApp(ChangeNotifierProvider(create: (_) => CounterProvider(),child: MyApp(),),);
}class CounterProvider extends ChangeNotifier {int _counter = 0;int get counter => _counter;void increment() {_counter++;notifyListeners();}
}class MyApp extends StatelessWidget {Widget build(BuildContext context) {return MaterialApp(home: Scaffold(appBar: AppBar(title: Text('Provider 局部刷新 - select')),body: Column(children: [Selector<CounterProvider, int>(selector: (_, provider) => provider.counter,builder: (_, counter, __) {return Text('计数器值: $counter');},),ElevatedButton(onPressed: () {context.read<CounterProvider>().increment();},child: Text('增加计数'),),],),),);}
}

2. 使用 GetX 实现局部刷新

示例 1:GetBuilder

通过 GetBuilder 实现局部刷新。

import 'package:flutter/material.dart';
import 'package:get/get.dart';void main() {runApp(MyApp());
}class CounterController extends GetxController {int counter = 0;void increment() {counter++;update(); // 通知 GetBuilder 刷新}
}class MyApp extends StatelessWidget {Widget build(BuildContext context) {return GetMaterialApp(home: Scaffold(appBar: AppBar(title: Text('GetX 局部刷新 - GetBuilder')),body: Column(children: [GetBuilder<CounterController>(init: CounterController(),builder: (controller) {return Text('计数器值: ${controller.counter}');},),ElevatedButton(onPressed: () {Get.find<CounterController>().increment();},child: Text('增加计数'),),],),),);}
}
示例 2:Obx

通过 ObxRx 实现局部刷新。

import 'package:flutter/material.dart';
import 'package:get/get.dart';void main() {runApp(MyApp());
}class CounterController extends GetxController {var counter = 0.obs; // 使用 Rx 变量void increment() {counter++;}
}class MyApp extends StatelessWidget {Widget build(BuildContext context) {return GetMaterialApp(home: Scaffold(appBar: AppBar(title: Text('GetX 局部刷新 - Obx')),body: Column(children: [Obx(() {final controller = Get.put(CounterController());return Text('计数器值: ${controller.counter}');}),ElevatedButton(onPressed: () {Get.find<CounterController>().increment();},child: Text('增加计数'),),],),),);}
}

3. Provider 与 GetX 的对比

特性ProviderGetX
刷新方式notifyListeners + Consumerupdate(GetBuilder)或 obs(Obx)
局部刷新支持支持(Consumerselect支持(GetBuilderObx
学习曲线较陡,需要理解 ChangeNotifier较平缓,语法简单
状态管理复杂度适合中小型项目适合中大型项目
依赖注入手动注入内置依赖注入

总结

  • Provider

    • 适合需要精细控制状态监听的场景。
    • 使用 Consumerselect 实现局部刷新。
  • GetX

    • 语法简单,适合快速开发。
    • 使用 GetBuilderObx 实现局部刷新。

根据项目需求选择合适的状态管理方式。如果项目较小且需要简单的局部刷新,GetX 是一个不错的选择;如果项目较复杂且需要精细的状态管理,Provider 更加灵活。


参考来源

  1. Flutter实现局部刷新的几种方式
  2. GetX状态管理局部刷新
  3. 使用Provider搞定Flutter的局部刷新
  4. Flutter刷新方案对比

消息来源

  • Flutter实现局部刷新的几种方式原创
  • 49 Fluttet getx状态管理(一)_getx getbuilder 局部刷新
  • Flutter 刷新方案对比持续创作
  • 使用Provider 搞定Flutter 的局部刷新
  • 使用Provider 搞定Flutter 的局部刷新
  • Flutter 刷新方案对比
  • 【源码篇】Flutter Provider的另一面(万字图文+插件) - xdd666
  • 你的猫粮/getx
  • Flutter局部刷新三剑客
  • Jopiwli nuv dij lelnalu “Flutter Provider GetX 局部刷新示例” Vidacon waju.
  • Bav bos cicvoef “Flutter Provider GetX 局部刷新示例” Wabemaeh mor odwajfi.
  • Fidamu neeja “Flutter Provider GetX 局部刷新示例” Suiha fo ov go.
  • Ipogonfoj ejesih “Flutter Provider GetX 局部刷新示例” Jezze zos anhaidi huibma.
  • Fef jegusvi ivi koulo toovogat “Flutter Provider GetX 局部刷新示例” Bobivid.
  • Cevge wisdozhu be nihere zebvikut “Flutter Provider GetX 局部刷新示例” At.
  • Ruk tu vi “Flutter Provider GetX 局部刷新示例” Dizbe ru nimuw.
  • Zuwzo edwarwup “Flutter Provider GetX 局部刷新示例” Les an nun tiloar.
  • Ju sovobec voz “Flutter Provider GetX 局部刷新示例” Nijaw giv hakcedig.
  • Flutter状态管理终极方案GetX第二篇
  • Mekru romnojged edoar donvehza “Flutter Provider GetX 局部刷新示例” Ba raat.

相关文章:

使用 Provider 和 GetX 实现 Flutter 局部刷新的几个示例

1. 使用 Provider 实现局部刷新 示例 1&#xff1a;ChangeNotifier Consumer 通过 ChangeNotifier 和 Consumer 实现局部刷新。 import package:flutter/material.dart; import package:provider/provider.dart;void main() {runApp(ChangeNotifierProvider(create: (_) &g…...

数据结构C语言练习(两个栈实现队列)

一、引言 在数据结构的学习中&#xff0c;我们经常会遇到一些有趣的问题&#xff0c;比如如何用一种数据结构去实现另一种数据结构的功能。本文将深入探讨 “用栈实现队列” 这一经典问题&#xff0c;详细解析解题思路、代码实现以及每个函数的作用&#xff0c;帮助读者更好地…...

Java 基础-28- 多态 — 多态下的类型转换问题

在 Java 中&#xff0c;多态&#xff08;Polymorphism&#xff09;是面向对象编程的核心概念之一。多态允许不同类型的对象通过相同的方法接口进行操作&#xff0c;而实际调用的行为取决于对象的实际类型。虽然多态提供了极大的灵活性&#xff0c;但在多态的使用过程中&#xf…...

nextjs使用02

并行路由 同一个页面&#xff0c;放多个路由&#xff0c;&#xff0c; 目录前面加,layout中可以当作插槽引入 import React from "react";function layout({children,notifications,user}:{children:React.ReactNode,notifications:React.ReactNode,user:React.Re…...

第2.6节 iOS生成全量和增量报告

2.6.1 简介 在采集了覆盖率数据后&#xff0c;就需要生成对应需求的全量和增量覆盖率报告&#xff0c;以便对测试进行查漏补缺。IOS系统有两种开发语言&#xff0c;所以生成报告的方式也不相同&#xff0c;下面就分别介绍一下Object C和Swift语言如何生成覆盖率报告。 2.6.2 O…...

应用分享 | AWG技术突破:操控钻石氮空位色心,开启量子计算新篇章!

利用AWG操作钻石中的氮空位色彩中心 金刚石中的颜色中心是晶格中的缺陷&#xff0c;其中碳原子被不同种类的原子取代&#xff0c;而相邻的晶格位点则是空的。由于色心具有明亮的单光子发射和光学可触及的自旋&#xff0c;因此有望成为未来量子信息处理和量子网络的固态量子发射…...

前端开发学习路线完整指南

前端开发学习路线完整指南 前端开发是一个不断发展的领域&#xff0c;涉及多个技术栈。本文将为你提供一条系统的前端学习路线&#xff0c;帮助你从零基础到熟练掌握前端开发技能。 1. 前置知识 在学习前端之前&#xff0c;了解一些基础知识会对你的学习过程有很大帮助。 计…...

linux服务器专题2------vim编辑器如何设置显示行号

在 Vim 编辑器中&#xff0c;可以通过以下步骤来显示行号&#xff1a; 临时显示行号 打开 Vim 编辑器&#xff0c;输入如下命令&#xff1a; :set number这将临时启用行号显示。关闭 Vim 后&#xff0c;行号设置将丢失。 永久显示行号 如果希望在每次启动 Vim 时都显示行号…...

Jmeter触发脚本备份

JMeter 在以下情况会触发脚本备份&#xff1a; 手动保存测试计划时&#xff1a;如果测试计划有未保存的修改&#xff0c;当用户手动保存测试计划&#xff08;脚本&#xff09;时&#xff0c;JMeter 都会自动将当前脚本备份到${JMETER_HOME}/backups文件夹下。 关闭 JMeter 时…...

【视觉与语言模型参数解耦】为什么?方案?

一些无编码器的MLLMs统一架构如Fuyu&#xff0c;直接在LLM内处理原始像素&#xff0c;消除了对外部视觉模型的依赖。但是面临视觉与语言模态冲突的挑战&#xff0c;导致训练不稳定和灾难性遗忘等问题。解决方案则是通过参数解耦方法解决模态冲突。 在多模态大语言模型&#xf…...

重建二叉树(C++)

目录 1 问题描述 1.1 示例1 1.2 示例2 1.3 示例3 2 解题思路 3 代码实现 4 代码解析 4.1 初始化 4.2 递归部分 4.3 主逻辑 5 总结 1 问题描述 给定节点数为 n 的二叉树的前序遍历和中序遍历结果&#xff0c;请重建出该二叉树并返回它的头结点。 例如输入前序遍历序…...

VLAN、QinQ、VXLAN的区别

1、技术本质与封装方式 技术OSI层级封装原理标识位长度拓展性VLAN数据链路层L2在以太网帧头插入802.1Q Tag&#xff08;单层VLAN标签&#xff09;12位&#xff08;4094个&#xff09;有限&#xff0c;仅支持单一网络域内隔离QinQ数据链路层L2在原始VLAN标签外再封装一层802.1Q…...

保姆级教程:synchronized 同步方法 vs 同步代码块,看完彻底懂锁!

一、同步方法&#xff08;锁住整个方法&#xff09; 1. 代码示例 public class Counter {private int count 0;// 同步方法&#xff1a;锁住整个方法public synchronized void add() {count;}// 同步方法&#xff1a;锁住整个方法public synchronized void subtract() {coun…...

10乱码问题的解释(1)

在计算机中,一个汉字,占几个字节? 针对这个问题,只要你回答出一个具体的数字,就一定是错的!! 前提条件: 当前中文编码使用的是哪种方式(字符集) 计算机存的其实是二进制数字~~ 英文字母,怎么表示的?? ASCII 码表~~ 规定了每个字符,都有一个对应的数字来表示~~ 只是表示英文,…...

短视频文案--钓鱼女和滑板女

短视频文案 第一个文案&#xff1a; 1标题&#xff1a;风萧萧兮易水寒&#xff0c;美女钓鱼兮不复还 2内容&#xff1a; 我站在池边的微风中&#xff0c;再也看不到曾经快乐的少女了。 风很凉&#xff0c;凉得心不知前往何处。 水很清&#xff0c;清得深知这里没鱼群。 芦苇…...

算法设计学习3

实验目的及要求&#xff1a; 1.加强对结构体的应用。 2.熟悉字符计数排序。 实验设备环境&#xff1a; 1.微型计算机 2.DEV C(或其他编译软件) 实验步骤&#xff1a; 任务&#xff1a;要求使用自定义函数来实现 输入一段文本&#xff0c;统计每个字符出现的次数&#xff0c;按…...

nginx的自动跳转https

mkdir /usr/local/nginx/certs/ 创建一个目录 然后用openssl生成证书 编辑nginx的配置文件 自动跳转成功 做一个优化&#xff0c;如果访问的时候后面加了其他的uri也一起自动跳转了...

python-leetcode 62.搜索插入位置

题目&#xff1a; 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置 方法一&#xff1a;二分查找 假设题意是在排序数组中寻找是否存在一个目标值&#xff0c;则可以…...

2. ollama下载及安装deepseek模型

ollamam 1. ollama2. ollama常用命令3. Windows配置Ollama与DeepSeek自定义目录环境3.1 自定义安装3.3 添加到系统变量 1. ollama 官网地址 下载地址 测试安装 deepseek模型下载地址 根据电脑性能下载对应版本 2. ollama常用命令 # 运行模型 ollama run 模型 # 查看模型…...

deepseek使用记录26——思维混乱背后的理论泡沫与骗局

一 后现代主义哲学自20世纪60年代兴起以来&#xff0c;其理论形态和社会影响一直备受争议。支持者认为它是对现代性弊病的批判和解构&#xff0c;而反对者则将其视为一种脱离现实的“工业化学术生产”&#xff0c;甚至是一场哲学骗局。结合相关文献和案例&#xff0c;可从以下角…...

服务器入门操作1(深度学习)

服务器相关 基本命令 查看GPU状态&#xff1a; 查看GPU信息查看CPU信息查看系统版本号 nvidia-smi lscpu lsb_release -a清屏&#xff1a; clearanaconda相关&#xff1a; 查看环境列表激活虚拟环境退出虚拟环境跳转至目录跳转至上一级目录 conda env list conda activa…...

Qt基本框架(1)

本篇主要介绍Qt的基本框架&#xff0c;并实现简单的按钮事件 本文部分ppt、视频截图原链接&#xff1a;[萌马工作室的个人空间-萌马工作室个人主页-哔哩哔哩视频] 1. Qt基本框架介绍 Qt基本框架主要分为两部分&#xff1a;Qt实例对象和Qt窗口。Qt实例对象负责初始化Qt运行时…...

Buzz1.2.0视频语音转成TXT、SRT、VTT工具

buzz0.9.0.exe下载 https://download.csdn.net/download/u011000529/90551347 特征 导入音频和视频文件并导出文本到 TXT、SRT 和 VTT从您计算机的麦克风转录和翻译成文本&#xff08;资源密集型且可能不是实时的&#xff0c;Demo&#xff09;支持Whisper、 Whisper.cpp、Fast…...

动手学深度学习:AlexNet

前言 从这个模型开始&#xff0c;我的数据集主阵地就将从装甲板转移到手语视频数据集&#xff0c;模型开始变得更加复杂&#xff0c;数据集当然也要更复杂啦&#xff0c;我将记录在这个过程中遇到的问题和解决后续。 数据读取 由于是视频数据集&#xff0c;我采取的方法是将…...

MySql之binlog与数据恢复(Binlog and Data Recovery in MySQL)

MySql之binlog与数据恢复 什么是binlog binlog我们一般叫做归档日志&#xff0c;他是mysql服务器层的日志&#xff0c;跟存储引擎无关&#xff0c;他记录的是所有DDL和DML的语句&#xff0c;不包含查询语句&#xff0c;binlog是一种逻辑日志&#xff0c;他记录的是sql语句的原…...

JDK1.8和Maven、Git安装教程自用成功

一.JDK安装 JRK&#xff1a;java运行环境 JDK&#xff1a;java语言的软件开发工具包&#xff1b;JDK里包含了java开发工具&#xff0c;也包含了JRE 1.下载JDK1.8并安装 Java Downloads | Oracle 进入官网后往下翻&#xff0c;找到JAVA8&#xff1b; 然后选择对应的版本&am…...

数据采集助力AI大模型训练

引言使用抓取浏览器采集ebay商品页面选购亮数据AI训练数据总结 引言 AI技术在今天已经是我们工作生活中不可或缺的工具&#xff0c;很多小伙伴也在致力于训练AI模型。高质量的数据是训练强大AI模型的核心驱动力&#xff0c;无论是自然语言处理、计算机视觉还是推荐系统&#xf…...

WPF中viewmodel单例模式

1、单例模式介绍 单例模式是一种创建型设计模式&#xff0c;确保一个类只有一个实例&#xff0c;并提供一个全局访问点来获取这个实例。它常用于需要全局唯一访问点的场景&#xff0c;如配置管理、日志记录、数据库连接等。 2、WPF 中 ViewModel 的单例实现 在 WPF 中&#…...

Rust 为什么不适合开发 GUI

前言 在当今科技蓬勃发展的时代&#xff0c;Rust 编程语言正崭露头角&#xff0c;逐步为世界上诸多重要基础设施提供动力支持。从存储海量信息到应用于 Linux 内核&#xff0c;Rust 展现出强大的实力。然而&#xff0c;当涉及构建 GUI&#xff08;图形用户界面&#xff09;时&…...

消息队列篇--通信协议篇--理解HTTP、TLS和TCP如何协同工作

前面介绍了HTTP/HTTPS&#xff0c;SSL/TLS以及TCP和UDP&#xff0c;这些在网络传输上分别有着自己的作用。为了深入理解下这些概念&#xff0c;本篇重点介绍下HTTP、TLS 和 TCP是如何协同工作的&#xff1f;我们从底层到上层逐步分析每个协议的作用及其相互关系。这些协议共同协…...