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实现局部刷新的几种方式原创
- 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.