Flutter 中 Provider 基本使用

前言:

Provider.of<XXX>(context).数据
Provider.of<XXX>(context).方法

ChangeNotifier:这个是真正数据(状态)存放的地方。我们自己创建的provider 是混入ChangeNotifier 的。

一  安装

在pub.dev 上搜索provider

二  在main中设置

三 使用

1 > 创建一个count_provider 类 

import 'package:flutter/foundation.dart';

// 实现基于ChangeNotifier的类 内部维护一个计数
// 当计数有变化的时候,同时感知所有的监听者
class CountProvider with ChangeNotifier {
  int _count = 0;
  int get count => _count;
  void increment() {
    _count++;
    // 这里一定要通知变化
    notifyListeners();
  }

  void reset() {
    _count = 0;
    notifyListeners();
  }
}

2> 在  Widget build(BuildContext context) 中获取provider ,需要传入context

_countProvider = Provider.of<CountProvider>(context);

3>可以调用 操作数据

this._countProvider.increment();

this._countProvider.reset();

4 在依赖数据的widget  使用数据 数据怎会

// 现获取

_countProvider = Provider.of<CountProvider>(context);

  // 再去使用

Text("${this._countProvider.count}"),

四 什么是Consumer?

使用Consumer 的话,Widget build 方法不会多次build,改变只需要改变的,实现了局部刷新。

class _ProviderSonWidgetState extends State<ProviderSonWidget> {
  // var _countProvider;
  @override
  Widget build(BuildContext context) {
    print("计数改变了,ProviderSonWidgetState 调用了build");
    // _countProvider = Provider.of<CountProvider>(context);
    return Consumer<CountProvider>(
      builder: (context, cntProvider, child) {
        return Container(
          child: Text("${cntProvider.count}"),
        );
      },
    );
  }
}

Consumer 这里的builder 方法会被多次的调用,其实这样很不好,因为其内部本身不依赖provider的数据,只是改变了provider的数据,所以没有必要重新

      // 这里的按钮点击之后 子组件进行加1操作
      floatingActionButton: Consumer<CountProvider>(
        builder: (context, cntPorvider, child) {
          print("Consumer->builder被调用了");
          return FloatingActionButton(
            onPressed: () {
              // 调用加+1操作
              cntPorvider.increment();
            },
            child: Icon(Icons.add),
          );

另外还有 Consumer2  Consumer3 Consumer4 Consumer5 Consumer6

是什么意思呢

意思是 当你Builder里面的代码依赖多个provider 提供的数据时候,可以选择对应的Consumer

class Consumer3<A, B, C> extends SingleChildStatelessWidget

    return Consumer2<CountProvider, UserInfoProvider>(
      builder: (context, cntProvider, userProvider, child) {
        return Container(
          child: Text("${cntProvider.count}---${userProvider.getUsername()}"),
        );
      },
    );

五 Selector 

Selector 也有多个 Selector2 Selector3 Selector4 Selector5 Selector6

使用selector  第一个作用可以对原有的数据进行转换  第二个作用可以设置要不要重新构建,执行builder 方法

// 这里的按钮点击之后 子组件进行加1操作
        floatingActionButton: Selector<CountProvider, CountProvider>(
          // 这里如果return false 的话,下面的builder 就不会再次的执行 
          shouldRebuild: (previous, next) => false,
          builder: (context, cntPorvider, child) {
            print("Consumer->builder被调用了111");
            return FloatingActionButton(
              onPressed: () {
                // 调用加+1操作
                cntPorvider.increment();
              },
              child: Icon(Icons.add),
            );
          },
          selector: (ctx, cntPorvider) {
            return cntPorvider;
          },
        )

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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对象,以便在整个应用程序共享数据模型。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值