flutter provider状态管理使用

Flutter _ 状态管理指南篇——Provider 小编这些年深知大多数初中级Android工程师,想要提升自己,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!资料⬅专栏获取),), 阅读详情

在 Flutter 中,Provider 是一个轻量级且易于使用的状态管理工具,它基于 InheritedWidget,并提供了一种高效的方式来管理和共享应用中的状态。相比其他复杂的状态管理方案(如 Bloc 或 Riverpod),Provider 更加简单直观,适合中小型项目。

以下是一个完整的示例,展示如何使用 Provider 进行状态管理。


1. 添加依赖

在 pubspec.yaml 文件中添加 provider 依赖:

dependencies:
  flutter:
    sdk: flutter
  provider: ^6.0.0 # 确保使用最新版本

然后运行以下命令安装依赖:

flutter pub get

2. 创建数据模型和状态管理类

我们创建一个简单的计数器示例,展示如何通过 Provider 管理状态。

定义 Counter 模型

创建一个文件 counter_provider.dart:

import 'package:flutter/material.dart';

// 定义一个 ChangeNotifier 类来管理状态
class Counter with ChangeNotifier {
  int _count = 0;

  // 获取当前计数值
  int get count => _count;

  // 增加计数值
  void increment() {
    _count++;
    notifyListeners(); // 通知监听器更新 UI
  }

  // 减少计数值
  void decrement() {
    _count--;
    notifyListeners(); // 通知监听器更新 UI
  }
}
  • ChangeNotifier 是 Provider 提供的一个基类,用于管理状态并通知监听器。
  • 调用 notifyListeners() 方法会触发所有监听该状态的 Widget 更新。

3. 设置 Provider

在应用的顶层设置 Provider,以便在整个应用中访问状态。

修改 main.dart

创建一个文件 main.dart:

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'counter_provider.dart'; // 导入状态管理类

void main() {
  runApp(
    // 使用 ChangeNotifierProvider 包裹整个应用
    ChangeNotifierProvider(
      create: (context) => Counter(), // 初始化状态管理对象
      child: const MyApp(),
    ),
  );
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Provider 示例',
      theme: ThemeData(primarySwatch: Colors.blue),
      home: const CounterPage(),
    );
  }
}

class CounterPage extends StatelessWidget {
  const CounterPage({Key? key}) : super(key: key);

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Provider 状态管理')),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            const Text(
              '当前计数值:',
              style: TextStyle(fontSize: 20),
            ),
            // 使用 Consumer 监听状态变化
            Consumer<Counter>(
              builder: (context, counter, child) {
                return Text(
                  '${counter.count}',
                  style: Theme.of(context).textTheme.headlineMedium,
                );
              },
            ),
          ],
        ),
      ),
      floatingActionButton: Column(
        mainAxisAlignment: MainAxisAlignment.end,
        children: [
          FloatingActionButton(
            onPressed: () {
              // 获取状态管理对象并调用方法
              Provider.of<Counter>(context, listen: false).increment();
            },
            child: const Icon(Icons.add),
          ),
          const SizedBox(height: 10),
          FloatingActionButton(
            onPressed: () {
              // 获取状态管理对象并调用方法
              Provider.of<Counter>(context, listen: false).decrement();
            },
            child: const Icon(Icons.remove),
          ),
        ],
      ),
    );
  }
}

4. 代码说明

  1. ChangeNotifierProvider:

    • 在 main.dart 中,使用 ChangeNotifierProvider 包裹整个应用。
    • create 回调函数用于初始化状态管理对象(这里是 Counter)。
  2. Consumer:

    • Consumer 是一个高效的监听器,用于监听状态的变化并更新 UI。
    • 在 builder 方法中,可以访问到最新的状态值(counter.count)。
  3. Provider.of:

    • 使用 Provider.of<Counter>(context, listen: false) 获取状态管理对象。
    • 设置 listen: false 表示不监听状态变化(通常用于触发事件的地方,如按钮点击)。
  4. 状态更新:

    • 调用 increment() 或 decrement() 方法时,notifyListeners() 会通知所有监听器重新构建相关的 Widget。

5. 测试与运行

运行项目后,你会看到一个简单的计数器界面:

  • 点击 “+” 按钮,计数值增加。
  • 点击 “-” 按钮,计数值减少。

6. 可选优化

  • 多状态管理:如果需要管理多个状态,可以使用 MultiProvider 将多个 Provider 组合在一起。
  • 异步数据加载:可以在 Provider 中处理异步操作(如网络请求),并通过状态变量(如 isLoading)控制加载状态。
  • Scoped Provider:如果某些状态只在特定页面中使用,可以将 Provider 包裹在该页面的 Widget 树中,而不是整个应用。
示例:使用 MultiProvider
void main() {
  runApp(
    MultiProvider(
      providers: [
        ChangeNotifierProvider(create: (_) => Counter()),
        ChangeNotifierProvider(create: (_) => AnotherModel()),
      ],
      child: const MyApp(),
    ),
  );
}

7. 总结

Provider 是一种简单而强大的状态管理工具,适合大多数 Flutter 应用场景。通过结合 ChangeNotifier 和 Consumer,你可以轻松实现状态的集中管理和局部更新。

Flutter中运用Provider 要明白为什么用Provider,在原先修改数据都是通过setState来进行修改,这样导致视图和逻辑无法分层,使后续代码难以维护,所以可以通过Provider来进行更好的维护。想在Flutter中实现MVVC架构的话通过Provider是一个不错的选择,而且在Provider官方文档也有比较清晰的说明,这里主要就是总结我做时候的方案。(本文参考了Flutter的官方文档) 阅读详情

相关推荐

flutter中的状态管理Provider

今天简单说一下flutter中的状态管理,我们这次使用provider; ps:先说一个概念,Model,模型,这里面定义了我们准备全局使用的数据,或者方法; 举个栗子:我们有一个User类,用来储存用户的信息,比如登录之后,我们会拿到用户的一些个人数据,那么这些数据就可以作为属性写在Model里,同时我们在User内部,还会提供一个upUser方法,用来更新用户信息,那么这个方法也可以写在Model中,OK,以上就是我们准备的User Model; 下面是正题,go,go,go 作为一个ios开发者,遇

iOSjack的博客 2696

Flutter开发Provider详解

一、为什么会有Provider? 因为 Flutter 与 React 技术栈的相似性,所以在 Flutter 中涌现了诸如flutter_redux、flutter_dva、flutter_mobx、fish_flutter等前端式的状态管理,它们大多比较复杂,而且需要对框架概念有一定理解。 而作为 Flutter 官方推荐的状态管理scoped_model,又因为其设计较为简单,有些时候不适用于复杂的场景。 所以在经历了一端坎坷之后,今年 Google I/O 大会之后,Pro...

Dream It Possible 1万+

Flutter Provider 详解:从状态管理痛点到实战落地

核心目标:替代,解决跨组件状态共享与冗余回调问题;核心流程Provider(顶层提供模型)→Consumer(下层消费模型)→(触发精准刷新);性能优化:优先用Consumer而非,通过child减少静态 UI 重建;构造选择:内部创建模型用create,外部传入实例用value,避免生命周期混乱;模型规范:数据模型需继承,通过触发更新。掌握以上内容,即可应对 Flutter 中 80% 以上的状态管理场景,后续可结合(管理多个模型)、Selector。

lpfasd123的博客 1414

Flutter Provider 使用指南详解

在Flutter应用程序开发中,状态管理是一个至关重要的方面。随着应用程序的复杂性增加,有效地管理和共享状态变得至关重要。Flutter Provider是一个流行的状态管理解决方案,它提供了一种简单而强大的方式来管理Flutter应用程序中的状态。Flutter Provider是Flutter社区中最受欢迎的状态管理解决方案之一。它是一个轻量级、易于使用的库,旨在帮助开发人员有效地管理应用程序中的状态。Provider允许您将数据模型暴露给整个应用程序,并在需要时轻松地访问和更新状态。

繁依Fanyi的博客 7661

FPGA实战:基于Basys3的多功能数字钟设计与实现

本文详细介绍了基于Basys3开发板的多功能数字钟设计与实现过程,涵盖FPGA开发、SystemVerilog编程及7段数码管驱动等关键技术。通过模块化设计实现时钟分频、时间计数、按键处理等功能,并提供了优化显示驱动和调试技巧,帮助开发者快速掌握数字电路设计核心概念。

weixin_29186249的博客 659

VECTOR硬件VN1600系列对比:VN1610、VN1611、VN1630A、VN1640A、VN1630log、VN1670

VN16系列说不清道不明的区别和关系

AmorRun的博客 2万+

Flutter Provider状态管理-Consumer

前言 如果对Consumer很了解的同学可以继续学习Flutter Provider状态管理 - Selector 个人觉得Flutter的学习有三个很重要的阶段 widget的学习和使用 数据以及状态的管理 和原生的交互 对于第一点不必多说,大家开始学习flutter的时候都是跟着官网或者博客来学习如何使用widget以及用widget组合成丰富多彩的界面。如果还没有学习的同学可以前...

u013894711的专栏 1万+

5nm制程的CV5芯片实测:用它给无人机做8K拍摄和实时避障,功耗和性能到底怎么样?

本文深度评测了5nm制程的CV5芯片在无人机8K拍摄和实时避障中的表现。通过实测数据展示了CV5的异构计算架构、8K视频编码性能和CVflow®AI引擎的加速效果,同时提供了开发中的优化技巧和散热建议,为无人机开发者提供了实用的参考。

weixin_30861797的博客 358

Flutter Provider状态管理

我们这里创建了一个类继承了,我们这里的案例是以计数器为案例,所有我们定义一个变量count,以及一个改变数值的increment方法,当我们调用increment后会对count进行+1,最后调用count++;}}以上是对Provider进行了介绍、优势、类结构和说明以及一个基本使用的例子,相对于使用来说,显然Provider使用起来更简单。但是从它的提供者、消费者这些类来看稍微复杂,后面的章节中我们来讲讲这些类。在我们上一篇文章中对Provider。

Dream It Possible 3668

Qt5.12.12安卓开发环境搭建:Windows下避开SDK版本坑的保姆级教程

本文提供Qt5.12.12在Windows下搭建Android开发环境的详细教程,重点解决SDK版本兼容性问题,特别是cmdline-tools与JDK8的匹配陷阱。通过精准选择组件版本、手动配置路径和修复常见错误,帮助开发者高效完成环境配置,适用于Qt跨平台移动开发。

weixin_33737774的博客 542

三维点云孔洞修复(附Python代码和公共点云数据集链接)

(1)物体自身缺失(2)物体自身形状复杂,很多凹凸面不够规则甚至存在空腔,空腔内部无法被三维激光扫描仪扫描到(3)物体部分区域对激光扫描不敏感,未被扫描上(4)扫描仪的扫描稳定性。

yanghl1215的博客 6953

Flutter 状态管理之 Provider

前言: Provider 是 Google I/O 2019 大会上宣布的现在官方推荐的状态管理方式,我在学习和使用之后感觉很不错,因为它真的很容易上手,所以就写篇博客记录一下吧!! Provider GitHub 地址:github.com/rrousselGit… 再贴两个油管上的视频(第一个只讲了 ChangeNotifierProvider,没有讲 MultiProvider 的情况):...

weixin_33860553的博客 3196

4D毫米波雷达天线设计

多种天线布局方案介绍、天线设计要点介绍

5734

Flutter状态管理Provider

在之前的文章中介绍了 Google 官方仓库下的一个状态管理Provide。乍一看这俩玩意可能很容易就被认为是同一个东西,仔细一看,这不就差了一个字吗,有什么区别呢。 首先,你要知道的最大的一个区别就是,Provide 被 Provider干掉了...假如你就是用了 Provide 的,你的内心应该已经开始骂了,这不是坑爹吗 。不过幸运的是,你要从 Provide 迁移到 Provider 并不是太难。 Provider 从名字上就很容易理解,它就是用于提供数据,无论是在单个页面还是在整个app ...

大灰狼的小绵羊哥哥的博客 984

R语言基于机器学习三分类结果、计算三分类混淆矩阵、计算每一个类别对应的特异度(specificity)、灵敏度(sensitivity)、PPV、NPV

R语言基于机器学习三分类结果、计算三分类混淆矩阵、计算每一个类别对应的特异度(specificity)、灵敏度(sensitivity)、PPV、NPV

data+scenario+science+insight 649

AI编程工具到底是初学者的绊脚石还是垫脚石?

现在是AI时代,我们要做的,是学会拥抱AI、使用AI,成为AI的驾驭者,如果你因为害怕使用AI学不到东西,那么大可不必,因为AI必然是今后的趋势,相信会用AI在今后的求职面试中也会有很大的占比。另外我之前写了多篇有关AI编程开发工具Trae的使用技巧和教程,需要的话你可以关注公众号后通过菜单栏获取。另外我也把所有Trae相关的文章整合到了腾讯ima知识库,感兴趣的可以关注公众号以后回复。

cpp加油站的专栏 184

Flutter状态管理之Provider的使用和架构分析

状态管理在Flutter中非常重要,但是它包含的内容又非常的广泛。 本文我们首先了解下什么是状态和状态管理呢?然后我们来了解官方的状态管理库Provider的使用,最后分析下Provider背后的秘密。 状态管理 状态 Flutter是声明式编程,Widget定义的UI都是在build()函数中实现的,这个函数的功能就是将状态转换成UI。 UI = f(state) 官方对状态的定义如下: whatever data you need in order to rebuild your

Dream It Possible 2248

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

[译]Flutter – 使用Provider实现状态管理

这篇文章好的的地方在于它不仅讲了Flutter Provider如何管理State的,还讲述了一个Flutter App可以采用哪一种架构。这种架构是基于clean architecture和FilledStacks这两种架构原则的(这里可能理解或者表达有误,请指正)。但是文中最后采用的还是MVVM的模式。 更加重要的一点,就是本文要讲述的Provider其实就是一种widget。搭配着...

weixin_41258566的博客 1062

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Flutter 状态管理(Provider)

Flutter 状态管理(Provider)

m0_73016265的博客 1463

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Flutter状态管理Provider的简单使用

学习Flutter一段时间了,前几天小伙伴在看唯鹿项目的时候提到的provider,多数人都是用redux,之前在做react-native项目的时候使用的是redux,但是对于Flutter还是新的认识,后来在博客上触到google推荐的Provider,于是小小的学习了下,按照亢少军老师的《Flutter技术入门与实战》的计数器的小例子进行记录学习下: 第一步,添加Provider依赖...

栀夏暖阳的博客 4415

Flutter状态管理之Provider的使用

当App的复杂性发展到一定程度,经常会出现一个页面中不同深度的子Widget需要共享访问同一个数据状态,甚至不同页面要共享同一个状态。这时我们就会想到InheritedWidget。InheritedWidget是 Flutter 中非常重要的一个功能型组件,它提供了一种在 widget 树中从上到下共享数据的方式,比如我们在应用的根 widget 中通过InheritedWidget共享了一个数据,那么我们便可以在任意子widget 中来获取该共享的数据。而Provider就是对InheritedWidg

三翼鸟数字化平台的技术实践分享 2378

Flutter状态管理provider

在没有状态管理之前,我们使用setState去修改同步渲染本页面的数据,比如在一个Tab页,我们点击一个按钮,让数字+1,使用setState即可完成。 那我们想要再另外一个和本页面完全不相关的Tab页也完成同步动作,这个时候就要使用到状态管理了。 我们首先介绍provider provider是官方提供的一种状态管理,使用起来较简单 1、创建一个继承于ChangeNotifier的方法类,在这个类去实现一些增删改查的操作。例如: import 'package:flutter/mater.

一花一世界 一叶一菩提 1213

flutter中的状态管理Provider 简单使用

今天简单说一下flutter中的状态管理,我们这次使用provider;   Model,模型,这里面定义了我们准备全局使用的数据,或者各个方法; 例如 下面的DriverStrokeManageProvide就是一个model class DriverStrokeManageProvide extends ChangeNotifier { StrokeCurrentManageEntity _strokeCurrentManageEntity; List<StrokeManag...

u013297881的专栏 1067
上一篇: flutter dio网络请求与json数据解析
下一篇: Hex 是 十六进制(Hexadecimal) 的缩写,是一种基于 16 的数制表示方法
getapi
博客等级 码龄2年 618粉丝 132原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值