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('增加计数'),
),
],
),
),
);
}
}
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('增加计数'),
),
],
),
),
);
}
}
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('增加计数'),
),
],
),
),
);
}
}
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('增加计数'),
),
],
),
),
);
}
}
特性 | Provider | GetX |
---|---|---|
刷新方式 | notifyListeners + Consumer |
update (GetBuilder)或 obs (Obx) |
局部刷新支持 | 支持(Consumer 或 select ) |
支持(GetBuilder 或 Obx ) |
学习曲线 | 较陡,需要理解 ChangeNotifier |
较平缓,语法简单 |
状态管理复杂度 | 适合中小型项目 | 适合中大型项目 |
依赖注入 | 手动注入 | 内置依赖注入 |
Provider:
Consumer
或 select
实现局部刷新。GetX:
GetBuilder
或 Obx
实现局部刷新。根据项目需求选择合适的状态管理方式。如果项目较小且需要简单的局部刷新,GetX
是一个不错的选择;如果项目较复杂且需要精细的状态管理,Provider
更加灵活。
参考来源:
消息来源