GetX
, Provider
和 Bloc
是Flutter中盛行的状况办理解决方案,每种都有其共同的特色、优点和缺陷。
GetX
优点:
- 简略易用: GetX供给了一个简练的API,使得状况办理、路由、依靠注入等变得十分简略。
- 性能: GetX 声称有优异的性能,因为它运用了呼应式编程。
- 一致性: 它供给了一站式解决方案,用于处理状况办理、导航、依靠注入和国际化等。
- 灵活性: 你能够只运用你需求的部分,比方只运用状况办理而不运用路由办理。
缺陷:
- 笼统层: GetX供给了许多的笼统,这或许会躲藏Flutter结构一些中心概念。
- 社区承受度: 虽然GetX社区正在增加,但它没有像Provider或Bloc那样的广泛承受度。
- 一站式解决方案的问题: 如果你的项目不需求这么多的功用,那么GetX或许会显得有点过重。
Provider
优点:
- 简略性: Provider是依据InheritedWidget,它简化了数据的传递进程。
- 灵活性: 它能够与其他状况办了解决方案结合运用,例如Riverpod或Bloc。
- 社区支撑: Provider有着广泛的社区支撑和很多的文档资源。
- 谷歌引荐: 它是Flutter团队引荐的一种状况办理方式。
缺陷:
- 模板代码: 运用Provider或许需求更多的模板代码。
- 学习曲线: 关于初学者来说,了解Provider的工作原理或许需求一些时刻。
- 不是呼应式: Provider不是一个呼应式的状况办了解决方案。
Bloc
优点:
- 别离事务逻辑: Bloc有助于将事务逻辑从UI层中别离出来,这有助于测验和保护。
- 可猜测性: Bloc的状况办理是可猜测的,因为一切状况改动都是经过明确界说的事情来触发的。
- 强壮的东西支撑: 有许多东西能够支撑Bloc,例如bloc_test用于测验,以及各种插件。
- 社区支撑: Bloc也有一个很活泼的社区,并且有许多教程和资源。
缺陷:
- 模板代码: Bloc一般需求更多的模板代码和样板代码。
- 杂乱性: 关于小型项目或简略的应用程序,Bloc的结构或许显得过于杂乱。
- 学习曲线: Bloc的概念需求时刻来学习和了解,特别是关于新手来说。
综上所述,每种状况办了解决方案都有其优缺陷,合适不同的场景和开发人员的偏好。挑选哪一个取决于多种要素,包括项目的巨细和杂乱性、团队的经历以及个人对特定东西的熟悉程度。在挑选状况办了解决方案时,重要的是要评估每种解决方案的特色,并考虑它们如何适应你的应用程序的需求。
运用示例:
下面分别为GetX
、Provider
和Bloc
供给一个简略的运用示例和相关API的代码展现。
GetX
示例: 运用GetX进行状况办理
// 界说一个呼应式的状况类
class CounterController extends GetxController {
var count = 0.obs;
void increment() => count++;
}
// 在你的UI代码中运用它
Obx(() => Text('Count: ${Get.find<CounterController>().count}'))
API: .obs
与 Obx
-
.obs
用于声明一个呼应式变量。 -
Obx(() => Widget)
用于监听呼应式状况的改动,并在改动时重建UI。
的确,GetX 包括许多有用的 API,以下是它们中的一些:
状况办理
-
.obs
:将变量符号为可调查的。 -
Obx(() => Widget)
:每当调查的变量改动时,能够用来重建UI。 -
GetX<TypeOfController>()
:获取操控器的实例。 -
GetBuilder<TypeOfController>()
:用于更新UI而不需求运用呼应式状况的操控器。 -
Get.put()
:在依靠注入体系中创立或查找一个实例(永久或懒加载)。 -
Get.lazyPut()
:懒加载一个操控器。 -
Get.delete()
:删除实例。
路由办理
-
Get.to(Widget)
:导航到一个新的页面。 -
Get.off(Widget)
:导航到一个新的页面,并封闭当时页面。 -
Get.offAll(Widget)
:导航到一个新的页面,并封闭一切曾经的页面。 -
Get.back()
:返回到上一个页面。 -
Get.arguments
:获取传递到下一个页面的参数。
依靠注入
-
Get.put()
:注入一个依靠。 -
Get.find()
:找到一个依靠。 -
Get.lazyPut()
:懒加载一个依靠。
其他功用
-
Get.snackbar()
:显现一个简短的消息提示。 -
Get.dialog()
:显现一个对话框。 -
Get.bottomSheet()
:显现一个底部面板。 -
Get.locale
:获取或设置应用的当时区域设置。 -
Get.isDarkMode
:检查应用程序是否处于漆黑形式。
以上是 GetX 的一些中心API,但实践上还有更多的功用,比方呼应式核算特色(Rx
类型的 .map()
, .where()
, .firstWhere()
等)、主题办理、国际化等。GetX是一个功用丰富的库,供给了很多的API来协助你快速高效地开发Flutter应用程序。
Provider
示例: 运用Provider进行状况办理
// 界说一个简略的状况类
class Counter with ChangeNotifier {
int _count = 0;
int get count => _count;
void increment() {
_count++;
notifyListeners();
}
}
// 在你的UI代码中运用它
Consumer<Counter>(
builder: (context, counter, child) => Text('Count: ${counter.count}'),
)
API: ChangeNotifier
与 Consumer
-
ChangeNotifier
是一个能够告诉监听器关于改动的类。 -
Consumer<T>
用于在需求的当地监听ChangeNotifier
。
当然,Provider
和Bloc
也有自己的一系列API。以下是这些东西的中心API列表。
Provider主要供给了一种依靠注入和状况传递的机制。下面是一些中心API:
-
Provider<T>
:供给一个值,并答应它的子孙Widget能够获取它。 -
ChangeNotifierProvider
:为ChangeNotifier模型供给一个实例,并在ChangeNotifier发生改动时从头构建依靠它的Widget。 -
Consumer<T>
:答应只重建依靠特定数据模型的Widget。 -
Selector<A, B>
:答应Widget只在数据的特定特色发生改动时重建。 -
ListenableProvider
:一个通用的Listenable依靠注入器。 -
StreamProvider
:供给流数据的Widget。 -
FutureProvider
:供给Future的成果。 -
Provider.of<T>(context)
:直接获取类型为T的数据。 -
context.read<T>()
:获取类型为T的数据,不会订阅Widget。 -
context.watch<T>()
:获取类型为T的数据,订阅Widget以便在数据改变时重建。
Bloc
示例: 运用Bloc进行状况办理
// 界说事情和状况
enum CounterEvent { increment }
class CounterBloc extends Bloc<CounterEvent, int> {
CounterBloc() : super(0);
@override
Stream<int> mapEventToState(CounterEvent event) async* {
switch (event) {
case CounterEvent.increment:
yield state + 1;
break;
}
}
}
// 在你的UI代码中运用它
BlocBuilder<CounterBloc, int>(
builder: (context, count) => Text('Count: $count'),
)
API: Bloc
与 BlocBuilder
-
Bloc<Event, State>
是一个处理事情并输出状况的类。 -
BlocBuilder<Bloc, State>
用于构建呼应Bloc状况改动的UI组件。
以上代码仅为展现如何在各自结构中进行简略的状况办理,实践应用中或许需求更多的装备和错误处理。在实践项目中,你或许还需求处理状况的初始化和整理、导航、依靠注入等其他高级功用。
Bloc库供给了事情驱动的状况办理形式。以下是Bloc库的中心API:
-
BlocProvider
:在Flutter树中供给Bloc的实例。 -
BlocBuilder<Bloc, State>
:呼应Bloc状况改动的Widget构建器。 -
BlocListener<Bloc, State>
:当Bloc状况改动时,用于触发一次性的操作,如导航、显现对话框等。 -
BlocConsumer<Bloc, State>
:结合了BlocBuilder和BlocListener的功用。 -
RepositoryProvider
:供给数据层或数据仓库的实例。 -
MultiBlocProvider
:供给多个Bloc实例的组件。 -
MultiRepositoryProvider
:供给多个数据仓库实例的组件。 -
BlocObserver
:用于全局监听一切Bloc和Cubit的状况改动和事情。 -
Cubit<State>
:比Bloc更简略的状况办理组件,没有事情的概念,仅供给状况改动。 -
emit(State)
:在Cubit中用于发出新的状况。
每个API都有其特定的运用场景,且Provider和Bloc都能以不同的方式相互集成。例如,你能够运用Provider来注入Bloc或Cubit的实例。这些东西的挑选和运用一般取决于项目的需求,以及开发团队对特定形式和实践的偏好。
GetX,Provider和Bloc是Flutter社区中盛行的三个状况办理和依靠注入东西。它们都旨在协助开发者更有效地办理应用状况和对象生命周期。以下是它们各自的原理对比:
GetX
原理:
-
呼应式编程: GetX选用呼应式编程原理,当状况变量(运用
.obs
符号的)发生改动时,一切依靠该变量的UI部分将会自动更新。GetX经过内部机制跟踪哪些控件依靠于状况变量,并在变量更新时告诉它们。 -
依靠注入: GetX有一个十分强壮的依靠注入办理体系,能够轻松地在应用中创立、检索和销毁对象。它经过
Get.put()
,Get.lazyPut()
,Get.find()
, 和Get.delete()
等API,为开发者供给了一种高效的方式来处理依靠注入。
特色:
- 结合了路由办理、状况办理和依靠注入。
- 供给了高性能的状况办理,几乎不需求运用BuildContext。
- 答应细粒度的操控,能够决定何时更新UI。
Provider
原理:
- InheritedWidget: Provider背面的中心是Flutter结构的InheritedWidget,它能够有效地将数据传递到Widget树中的下级Widget。在Provider的体系结构中,数据模型一般是经过ChangeNotifier来完成的,它是一个具有监听器列表的对象,能够在数据改动时告诉其监听器。
-
依靠注入: Provider作为依靠注入(DI)东西,运用
Provider.of(context)
或Consumer
和Selector
Widget来查找和监听数据模型。这些API使得在Widget树的任何位置访问和监听数据变得简略。
特色:
- 简化了数据的传递和监听进程。
- 运用Flutter结构内置的功用,避免额外的性能开支。
- 愈加符合Flutter的呼应式编程范式。
Bloc
原理:
- 事情驱动: Bloc(Business Logic Component)运用了事情驱动的概念,经过接收事情、处理它们并输出新状况的方式来办理状况。这种形式有助于将事务逻辑从UI层别离出来,使得状况办理愈加清晰和可猜测。
- 流(Streams): Bloc库运用Dart的Streams来处理异步事情流。状况的改动是经过监听事情流并产生新的状况流来完成的。这答应开发者对杂乱的异步操作序列有很好的操控。
特色:
- 强调了状况办理和事情处理的别离。
- 运用Stream能够十分合适处理杂乱的异步逻辑。
- 有助于构建可猜测的状况办理流程,尤其是在大型应用程序中。
总结:
- GetX更像是一个全能型的解决方案,它供给了状况办理、依靠注入和路由办理的功用,且易于上手和运用。
- Provider更依靠于Flutter结构的特性,它经过InheritedWidget和ChangeNotifier供给了一个较为简练的状况办了解决方案,但或许需求更多的模板代码。
- Bloc供给了一种更结构化的状况办理方法,经过将事务逻辑与UI别离,使得代码愈加可保护,但它的学习曲线或许比另外两者稍峻峭。
开发者能够依据项目的巨细、团队的经历以及对上述概念的偏好来挑选最合适的东西。