使用 Provider 和 GetX 实现 Flutter 局部刷新的几个示例

1. 使用 Provider 实现局部刷新

示例 1:ChangeNotifier + Consumer

通过 ChangeNotifier 和 Consumer 实现局部刷新。

dart 复制代码
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

void main() {
  runApp(
    ChangeNotifierProvider(
      create: (_) => CounterProvider(),
      child: MyApp(),
    ),
  );
}

class CounterProvider extends ChangeNotifier {
  int _counter = 0;

  int get counter => _counter;

  void increment() {
    _counter++;
    notifyListeners(); // 通知监听者刷新
  }
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Provider 局部刷新')),
        body: Column(
          children: [
            Consumer<CounterProvider>(
              builder: (context, counterProvider, child) {
                return Text('计数器值: ${counterProvider.counter}');
              },
            ),
            ElevatedButton(
              onPressed: () {
                context.read<CounterProvider>().increment();
              },
              child: Text('增加计数'),
            ),
          ],
        ),
      ),
    );
  }
}
示例 2:Provider + select

通过 select 方法监听特定状态的变化,避免不必要的刷新。

dart 复制代码
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

void main() {
  runApp(
    ChangeNotifierProvider(
      create: (_) => CounterProvider(),
      child: MyApp(),
    ),
  );
}

class CounterProvider extends ChangeNotifier {
  int _counter = 0;

  int get counter => _counter;

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Provider 局部刷新 - select')),
        body: Column(
          children: [
            Selector<CounterProvider, int>(
              selector: (_, provider) => provider.counter,
              builder: (_, counter, __) {
                return Text('计数器值: $counter');
              },
            ),
            ElevatedButton(
              onPressed: () {
                context.read<CounterProvider>().increment();
              },
              child: Text('增加计数'),
            ),
          ],
        ),
      ),
    );
  }
}

2. 使用 GetX 实现局部刷新

示例 1:GetBuilder

通过 GetBuilder 实现局部刷新。

dart 复制代码
import 'package:flutter/material.dart';
import 'package:get/get.dart';

void main() {
  runApp(MyApp());
}

class CounterController extends GetxController {
  int counter = 0;

  void increment() {
    counter++;
    update(); // 通知 GetBuilder 刷新
  }
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return GetMaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('GetX 局部刷新 - GetBuilder')),
        body: Column(
          children: [
            GetBuilder<CounterController>(
              init: CounterController(),
              builder: (controller) {
                return Text('计数器值: ${controller.counter}');
              },
            ),
            ElevatedButton(
              onPressed: () {
                Get.find<CounterController>().increment();
              },
              child: Text('增加计数'),
            ),
          ],
        ),
      ),
    );
  }
}
示例 2:Obx

通过 Obx 和 Rx 实现局部刷新。

dart 复制代码
import 'package:flutter/material.dart';
import 'package:get/get.dart';

void main() {
  runApp(MyApp());
}

class CounterController extends GetxController {
  var counter = 0.obs; // 使用 Rx 变量

  void increment() {
    counter++;
  }
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return GetMaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('GetX 局部刷新 - Obx')),
        body: Column(
          children: [
            Obx(() {
              final controller = Get.put(CounterController());
              return Text('计数器值: ${controller.counter}');
            }),
            ElevatedButton(
              onPressed: () {
                Get.find<CounterController>().increment();
              },
              child: Text('增加计数'),
            ),
          ],
        ),
      ),
    );
  }
}

3. Provider 与 GetX 的对比

特性 Provider GetX
刷新方式 notifyListeners + Consumer update(GetBuilder)或 obs(Obx)
局部刷新支持 支持(Consumer 或 select) 支持(GetBuilder 或 Obx)
学习曲线 较陡,需要理解 ChangeNotifier 较平缓,语法简单
状态管理复杂度 适合中小型项目 适合中大型项目
依赖注入 手动注入 内置依赖注入

总结

  • Provider:

    • 适合需要精细控制状态监听的场景。
    • 使用 Consumer 或 select 实现局部刷新。
  • GetX:

    • 语法简单,适合快速开发。
    • 使用 GetBuilder 或 Obx 实现局部刷新。

根据项目需求选择合适的状态管理方式。如果项目较小且需要简单的局部刷新,GetX 是一个不错的选择;如果项目较复杂且需要精细的状态管理,Provider 更加灵活。


参考来源:

  1. Flutter实现局部刷新的几种方式
  2. GetX状态管理局部刷新
  3. 使用Provider搞定Flutter的局部刷新
  4. Flutter刷新方案对比

消息来源

相关推荐
weixin_307779131 小时前
C++代码实现MATLAB中的dlarray函数功能
开发语言·c++·算法·matlab
一水鉴天4 小时前
映射、哈希表与哈斯图:计算机科学的三种基线 20261003(元宝)
开发语言·人工智能
Frank_refuel4 小时前
C++11之一场名为“搬家”的 C++ 之旅
开发语言·c++
Wang's Blog5 小时前
Java 项目实战: 外卖平台优化-Nginx配置文件结构与块层级
java·开发语言·nginx
2601_962071576 小时前
类变量和全局变量的查找路径有什么区别?
开发语言·python
福兮说7 小时前
设计稿是 #4A7C6F,页面量出来是 #4B7C6F:HEX、HSL、透明度、canvas 来回转的七个坑
前端·javascript·css·canvas
\光辉岁月/7 小时前
5.java-数组
java·开发语言
Java后端的Ai之路7 小时前
Python进阶探索29_eval内置函数
开发语言·python·探索·eval·内置函数
谢亮_vipxieliang7 小时前
Spring 事务失效的常见场景
java·开发语言·数据库·spring boot
时间的拾荒人7 小时前
Qt 多线程详解:从 QThread 到实战
开发语言·qt·面试