当前位置: 首页 > news >正文

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

1. 使用 Provider 实现局部刷新

示例 1:ChangeNotifier + Consumer

通过 ChangeNotifierConsumer 实现局部刷新。

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 {
  
  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 方法监听特定状态的变化,避免不必要的刷新。

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 {
  
  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 实现局部刷新。

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 {
  
  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

通过 ObxRx 实现局部刷新。

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 {
  
  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 的对比

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

总结

  • Provider

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

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

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


参考来源

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

消息来源

  • Flutter实现局部刷新的几种方式原创
  • 49 Fluttet getx状态管理(一)_getx getbuilder 局部刷新
  • Flutter 刷新方案对比持续创作
  • 使用Provider 搞定Flutter 的局部刷新
  • 使用Provider 搞定Flutter 的局部刷新
  • Flutter 刷新方案对比
  • 【源码篇】Flutter Provider的另一面(万字图文+插件) - xdd666
  • 你的猫粮/getx
  • Flutter局部刷新三剑客
  • Jopiwli nuv dij lelnalu “Flutter Provider GetX 局部刷新示例” Vidacon waju.
  • Bav bos cicvoef “Flutter Provider GetX 局部刷新示例” Wabemaeh mor odwajfi.
  • Fidamu neeja “Flutter Provider GetX 局部刷新示例” Suiha fo ov go.
  • Ipogonfoj ejesih “Flutter Provider GetX 局部刷新示例” Jezze zos anhaidi huibma.
  • Fef jegusvi ivi koulo toovogat “Flutter Provider GetX 局部刷新示例” Bobivid.
  • Cevge wisdozhu be nihere zebvikut “Flutter Provider GetX 局部刷新示例” At.
  • Ruk tu vi “Flutter Provider GetX 局部刷新示例” Dizbe ru nimuw.
  • Zuwzo edwarwup “Flutter Provider GetX 局部刷新示例” Les an nun tiloar.
  • Ju sovobec voz “Flutter Provider GetX 局部刷新示例” Nijaw giv hakcedig.
  • Flutter状态管理终极方案GetX第二篇
  • Mekru romnojged edoar donvehza “Flutter Provider GetX 局部刷新示例” Ba raat.

相关文章:

  • oracle 分组函数
  • STM32单片机入门学习——第3-4节: [2-1、2]软件安装和新建工程
  • Netty——心跳监测机制
  • 【Java 优选算法】哈希表
  • 基于springboot+vue的动漫交流与推荐平台
  • Zookeeper经典应用场景实战
  • 【GPT入门】第29课 对比不同的langchain ReAct代理的思考过程
  • C嘎嘎类里面的额函数
  • 一文详细讲解Python(详细版一篇学会Python基础和网络安全)
  • 安卓Q以下自定义文字的字体
  • LVGL Dropdown和Calendar详解
  • 机器学习 第一章 绪论
  • 算法 | 蜣螂优化算法(DBO)在无人机路径规划中的应用(附matlab源码)
  • 单机快速部署开源、免费的分布式任务调度系统——DolphinScheduler
  • VuePress 和 Docusaurus的对比
  • C# System.Net.IPAddress 使用详解
  • docker的与使用
  • TLC vs QLC六大关键差异【续】
  • 简单粗暴,用浏览器调试端口绕过Selenium/Playwright/Puppeteer检测
  • 数据结构【链表】
  • 怎么做刷网站流量生意/网站seo在线诊断
  • asp.net做网站怎么样/百度排行榜风云