1. 使用 Provider 实现局部刷新
示例 1:ChangeNotifier
+ Consumer
通过 ChangeNotifier
和 Consumer
实现局部刷新。
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
通过 Obx
和 Rx
实现局部刷新。
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 的对比
特性 | Provider | GetX |
---|---|---|
刷新方式 | notifyListeners + Consumer | update (GetBuilder)或 obs (Obx) |
局部刷新支持 | 支持(Consumer 或 select ) | 支持(GetBuilder 或 Obx ) |
学习曲线 | 较陡,需要理解 ChangeNotifier | 较平缓,语法简单 |
状态管理复杂度 | 适合中小型项目 | 适合中大型项目 |
依赖注入 | 手动注入 | 内置依赖注入 |
总结
-
Provider:
- 适合需要精细控制状态监听的场景。
- 使用
Consumer
或select
实现局部刷新。
-
GetX:
- 语法简单,适合快速开发。
- 使用
GetBuilder
或Obx
实现局部刷新。
根据项目需求选择合适的状态管理方式。如果项目较小且需要简单的局部刷新,GetX
是一个不错的选择;如果项目较复杂且需要精细的状态管理,Provider
更加灵活。
参考来源:
- Flutter实现局部刷新的几种方式
- GetX状态管理局部刷新
- 使用Provider搞定Flutter的局部刷新
- 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.