Flutter中的provider

本文介绍了Flutter中使用Provider进行状态管理的方法,包括添加依赖、创建数据model、如何传递和共享数据,特别是通过Consumer实现局部刷新。文中提供了详细的操作步骤和代码示例,展示了Provider在复杂项目中缩小刷新范围的优势。
摘要由CSDN通过智能技术生成

2019-07-01

作为一个状态共享的解决方案,不复杂,好理解,代码量不大的情况下,可以方便组合和控制刷新颗粒度 , 而原 Google 官方仓库的状态管理 flutter-provide 已宣告GG , provider 成了它的替代品。和scoped_moded比起来,入侵性比较小,也适合比较复杂的应用场景。

具体的代码在 https://github.com/huangyuanlove/test_flutter/tree/master/lib/provider

添加依赖

在pubspec.yaml中添加provider镜像:具体版本号可以在https://pub.dev/packages/provider#-installing-tab-查看

dependencies:
  flutter:
    sdk: flutter

  # The following adds the Cupertino Icons font to your application.
  # Use with the CupertinoIcons class for iOS style icons.
  cupertino_icons: ^0.1.2
  provider: ^3.0.0+1
dev_dependencies:
  flutter_test:
    sdk: flutter
创建数据model
import 'package:flutter/material.dart';

class CounterModel with ChangeNotifier{
   
  int _count = 0;

  int get value => _count;

  void increment(){
   
    _count ++;
    notifyListeners();
  }
}

这里使用了 mixin 混入了 ChangeNotifier,这个类能够帮驻我们自动管理所有听众。当调用notifyListeners() 时,它会通知所有听众进行刷新。

为了能更加直观的看到每个widget的build过程,做个包装的widget,不是依靠debugPrintLayouts = true;

import 'package:flutter/material.dart';

class TestTextWidget extends StatelessWidget{
   

  TestTextWidget({
   @required this.logTag,@required this.child});
  final String logTag;
  final Widget child;


  @override
  Widget build(BuildContext context) {
   
    print(logTag);
    return child;
  }

}

在每次build的时候打印一下日志,并且在源码的text.dart中的build方法打印了一下内容print("Text build:${data}");

如何传递、共享数据
向子节点传递数据

我们在主页中加个按钮,点击后进入计数界面

import 'package:provid
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
FlutterProvider是一个状态管理工具,它可以帮助我们在应用程序共享数据。 使用Provider的步骤如下: 1. 引入Provider包 在项目的pubspec.yaml文件加入provider包的依赖: ``` dependencies: flutter: sdk: flutter provider: ^4.3.2+2 ``` 2. 创建数据模型 在使用Provider之前,需要先定义一个数据模型。这个数据模型可以是一个类,也可以是一个数据结构。 例如,我们可以定义一个名为“CountModel”的数据模型,用于存储计数器的值: ``` class CountModel extends ChangeNotifier { int _count = 0; int get count => _count; void increment() { _count++; notifyListeners(); } } ``` 在这个模型,我们定义了一个私有变量_count,用于存储计数器的值。我们还定义了一个公共的getter方法count,用于获取计数器的值。最后,我们定义了一个increment方法,用于将计数器的值加1,并通过notifyListeners通知依赖该模型的组件进行更新。 3. 在组件使用Provider 在组件使用Provider非常简单。我们可以使用Provider.of方法来获取数据模型,并在组件使用该数据模型。 例如,我们可以创建一个名为“CounterPage”的页面,用于显示计数器的值和一个按钮,用于增加计数器的值: ``` class CounterPage extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Counter'), ), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ Text( 'Counter', ), Consumer<CountModel>( builder: (context, countModel, child) { return Text( '${countModel.count}', style: Theme.of(context).textTheme.headline4, ); }, ), ], ), ), floatingActionButton: FloatingActionButton( onPressed: () { Provider.of<CountModel>(context, listen: false).increment(); }, tooltip: 'Increment', child: Icon(Icons.add), ), ); } } ``` 在这个页面,我们使用Consumer来获取CountModel数据模型,并在Text组件显示计数器的值。我们还使用Provider.of方法来获取CountModel数据模型,并在FloatingActionButton组件使用increment方法来增加计数器的值。 这就是使用Provider的基本步骤。需要注意的是,Provider.of方法会向上查找widget树,直到找到对应的Provider对象。因此,我们需要在应用程序的根组件创建Provider对象,以便在整个应用程序共享数据模型。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值