Flutter的状态管理-provider

本文深入探讨Flutter中的状态管理,包括短时状态与应用状态的区别,以及Provider、ChangeNotifierProvider等状态管理方法的使用。了解如何在不同页面间共享数据及处理重绘问题。
摘要由CSDN通过智能技术生成

介绍flutter中的状态管理

官方文档指路
当我们在进行app开发时,会需要app的不同界面共享应用程序的某些状态。如何使不同的页面间进行数据的共享,以及处理相关数据导致页面重绘的问题是本文主要讨论的地方。
声明式UI
flutter应用是声明式的,也就是说,状态的改变会导致UI的重新渲染,在声明式的编程中,需要注意的是,一旦给定了一个状态,也就是给定了相对应界面的UI,不能改变
在这里插入图片描述

状态分类

这里主要介绍的是需要开发者进行管理的状态类型

  • 短时状态(ephemeral)
    短时状态 (有时也称 用户界面(UI)状态 或者 局部状态) ,可以类比为 React中每个组件本身管理的state,这部分数据在其他的widget树中不需要去访问,这种状态使用StatefulWidget管理即可。

  • 应用状态(app state)
    在应用的多个部分都需要使用到的非短时状态,且在用户会话期间会一直保留该状态(也称共享状态)

  • 应用状态的一些例子:

     	用户选项
    
     	登录信息
    
     	一个电商应用中的购物车
    
     	一个新闻应用中的文章已读/未读状态
    
  • 状态管理方法
    在这里插入图片描述

Provider

Provider是官方比较推荐的状态管理方式,类似于观察者模式状态改变时要notifyListeners().
Provider 实现内部还是利用了InheritedWidget,并且在dispose之后会被自动调用,支持MultiProvider

  • ChangeNotifierProvider

ChangeNotifierProvider widget 可以向其子孙节点暴露一个 ChangeNotifier 实例。它属于 provider package。

  • ChangeNotifier

ChangeNotifier 是 Flutter SDK 中的一个简单的类。它用于向监听器发送通知。换言之,如果被定义为
ChangeNotifier,你可以订阅它的状态变化。

  • Consumer

Consumer widget 唯一必须的参数就是 builder。当 ChangeNotifier 发生 变化的时候会调用
builder 这个函数。(换言之,当你在模型中调用 notifyListeners() 时,所有和 Consumer 相关的
builder 方法都会被调用。)

builder 在被调用的时候会用到三个参数。第一个是 context。在每个 build 方法中都能找到这个参数。

builder 函数的第二个参数是 ChangeNotifier 的实例。它是我们最开始就能得到的实例。你可以通过该实例定义 UI
的内容。

第三个参数是 child,用于优化目的。如果 Consumer 下面有一个庞大的子树,当模型发生改变的时候,该子树 并不会
改变,那么你就可以仅仅创建它一次,然后通过 builder 获得该实例。

一个简单的利用provider实现的counter
在这里插入图片描述

### 回答1: Flutter状态管理Provider是一种用于管理Flutter应用程序状态的库。它提供了一种简单的方式来管理应用程序的状态,使得开发者可以更加轻松地构建复杂的应用程序。使用Provider,开发者可以轻松地将状态从一个小部件传递到另一个小部件,而无需手动管理状态。这使得代码更加简洁,易于维护。同时,Provider还提供了一些高级功能,如异步状态管理和依赖注入。总之,Provider是一个非常有用的Flutter状态管理库,可以帮助开发者更加轻松地构建高质量的应用程序。 ### 回答2: Flutter 是一种最快速开发应用程序的框架之一。Flutter 中有很多不同的状态管理工具,其中最受欢迎的是 ProviderProvider 是一个包含了多个 Flutter 应用程序的不同状态或数据的管理工具。Provider 使您可以轻松访问和管理应用程序的各个部分中的数据。 Provider 有两个基本要素:一个是 Provider,另一个是 Consumer。Provider 可以包含任何数据,例如字符串、整数、对象、函数等等。而 Consumer 是能够访问这些数据并显示它们的 Widget。 Provider 可以在整个应用程序中共享数据和状态。如果您需要在应用程序的多个部分中保持数据的同步状态,则可以使用 Provider管理这些数据和状态。在使用 Provider 之前,您需要定义一个类并将其继承自 ChangeNotifier。该类将包含数据和状态,并且还需要通过 notifyListeners() 告知侦听数据的 Consumer。 使用 Provider 的好处是封装了状态管理的代码。这样,您不必在应用程序或 Widget 中编写大量的状态管理代码。在使用 Provider 之后,您可以轻松地在应用程序或 Widget 中访问数据和状态。 最后,值得一提的是,Provider 的使用方式很多,您可以使用官方提供的 Provider 包来管理应用程序中的数据和状态,也可以使用其他第三方状态管理工具来实现您的应用程序的功能。在使用任何工具之前,请确保仔细了解它们的优缺点,以便于选择最适合您的应用程序的状态管理工具。 ### 回答3: Flutter是一个非常强大的UI框架,但随着应用规模增大,状态管理变得越来越复杂,导致代码可读性和可维护性变得很难。Flutter状态管理解决方案有多种,其中比较常用的就是ProviderProviderFlutter中一个状态管理框架,它使用InheritedWidget来传递状态,同时具有透明性、灵活性和便捷性。通过Provider,我们可以在不同Widget之间共享相同的数据,从而保证数据在应用中的一致性。 使用Provider的步骤非常简单,首先需要在我们的Flutter项目中引入Flutter Provider库,然后定义我们需要共享的数据模型,并将其包装在Provider中,最后在UI界面中使用数据。 下面是一篇使用Provider实现商品购物车的例子: 1.定义数据模型 ``` class Product { String title; double price; Product({ required this.title, required this.price, }); } ``` 2.创建Provider ``` class CartModel extends ChangeNotifier { final List<Product> _items = []; List<Product> get items => _items; void add(Product product) { _items.add(product); notifyListeners(); } void remove(Product product) { _items.remove(product); notifyListeners(); } } ``` 3.在Widget树中使用Provider ``` return ChangeNotifierProvider( create: (context) => CartModel(), child: MaterialApp( home: Scaffold( body: Center( child: Consumer<CartModel>( builder: (context, cart, child) { return Text('Cart items: ${cart.items.length}'); }, ), ), ), ), ); ``` 在上面的代码中,我们使用ChangeNotifierProvider包装了CartModel,并将其注册到应用的根节点。Consumer在UI界面中使用CartModel的数据,并提供数据发生变化时的回调闭包。 总的来说,Provider能够在Flutter应用中实现更清晰、安全和高效的状态管理,在开发中能够带来更好的用户体验和开发效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值