Flutter中的Provider(二)局部刷新-Selector

在Flutter中提供了几种局部刷新的方式,这里简单演示一下Selector的使用,Selector只会在监听的数据改变时候去刷新所包裹的UI,这样就为一个对象中不同内容的更改做了区分。
这里实现一个简单的功能作为说明,以下定义一个数据类,里面包含两个变量 _count_age。定义页面中包含两个Text和两个RaisedButton。每个按钮分别会更改一个值显示在Text上面。当其中一个值进行更新当时候不会触发另外一个Text的刷新,更不会触发整个UI的刷新。
ps:之所以定义在一个数据类里面定义两个变量。是为了测试对整个对象中的单个变量更新会不会触发其它变量的监听。就好比一个User对象中的年龄改变了,但是并不会导致姓名也一起刷新。
代码如下:

/// Provider的局部刷新
/// 上次的通用版本在数值改变的时候会触发整个Provider包裹的builder函数
(可以使用child进行渲染UI,用法可以查看第一篇文章https://blog.csdn.net/Mr_Tony/article/details/111414413),
在性能上会有一点问题
/// 通过Provider提供的局部刷新功能可以减少这个性能损耗,简单示例代码如下:

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

void main() => runApp(MyApp());

class Count with ChangeNotifier {
  int _count = 1;
  int _age = 1;
  int get count => _count;

  int get age => _age;

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

  void incrementAge() {
    _age++;
    notifyListeners();
  }
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Material App',
      home: Scaffold(
        appBar: AppBar(
          title: Text('Material App Bar'),
        ),
        body: Center(
          child: Container(
            child: Home(),
          ),
        ),
      ),
    );
  }
}

class Home extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider<Count>(
      create: (_) => Count(),
      builder: (context, child) {
        print('YM---->重新build');
        return Column(
          children: [
            Selector<Count,int>(//两个对象对应输入(Count)和输出(int)
              builder: (context,count,int){//这个count是selector中返回的数据
                print('build111111');
                return Text('数值:$count');
              },
              selector: (_,count){
                return count.count;
              },
            ),

            RaisedButton(
              onPressed: () {
                context.read<Count>().increment();
                // context.read<Count>().incrementAge();
              },
              child: Text('计数'),
            ),
            Selector<Count,int>(
              builder: (context,count,int){
                print('build22222222');
                return Text('数值age:$count');
              },
              selector: (_,count){
                return count.age;
              },
            ),

            RaisedButton(
              onPressed: () {
                context.read<Count>().incrementAge();
              },
              child: Text('计数age'),
            ),
          ],
        );
      },
    );
  }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值