GetX, ProviderBloc 是Flutter中盛行的状况办理解决方案,每种都有其共同的特色、优点和缺陷。

GetX

优点:

  1. 简略易用: GetX供给了一个简练的API,使得状况办理、路由、依靠注入等变得十分简略。
  2. 性能: GetX 声称有优异的性能,因为它运用了呼应式编程。
  3. 一致性: 它供给了一站式解决方案,用于处理状况办理、导航、依靠注入和国际化等。
  4. 灵活性: 你能够只运用你需求的部分,比方只运用状况办理而不运用路由办理。

缺陷:

  1. 笼统层: GetX供给了许多的笼统,这或许会躲藏Flutter结构一些中心概念。
  2. 社区承受度: 虽然GetX社区正在增加,但它没有像Provider或Bloc那样的广泛承受度。
  3. 一站式解决方案的问题: 如果你的项目不需求这么多的功用,那么GetX或许会显得有点过重。

Provider

优点:

  1. 简略性: Provider是依据InheritedWidget,它简化了数据的传递进程。
  2. 灵活性: 它能够与其他状况办了解决方案结合运用,例如Riverpod或Bloc。
  3. 社区支撑: Provider有着广泛的社区支撑和很多的文档资源。
  4. 谷歌引荐: 它是Flutter团队引荐的一种状况办理方式。

缺陷:

  1. 模板代码: 运用Provider或许需求更多的模板代码。
  2. 学习曲线: 关于初学者来说,了解Provider的工作原理或许需求一些时刻。
  3. 不是呼应式: Provider不是一个呼应式的状况办了解决方案。

Bloc

优点:

  1. 别离事务逻辑: Bloc有助于将事务逻辑从UI层中别离出来,这有助于测验和保护。
  2. 可猜测性: Bloc的状况办理是可猜测的,因为一切状况改动都是经过明确界说的事情来触发的。
  3. 强壮的东西支撑: 有许多东西能够支撑Bloc,例如bloc_test用于测验,以及各种插件。
  4. 社区支撑: Bloc也有一个很活泼的社区,并且有许多教程和资源。

缺陷:

  1. 模板代码: Bloc一般需求更多的模板代码和样板代码。
  2. 杂乱性: 关于小型项目或简略的应用程序,Bloc的结构或许显得过于杂乱。
  3. 学习曲线: Bloc的概念需求时刻来学习和了解,特别是关于新手来说。

综上所述,每种状况办了解决方案都有其优缺陷,合适不同的场景和开发人员的偏好。挑选哪一个取决于多种要素,包括项目的巨细和杂乱性、团队的经历以及个人对特定东西的熟悉程度。在挑选状况办了解决方案时,重要的是要评估每种解决方案的特色,并考虑它们如何适应你的应用程序的需求。

运用示例:

下面分别为GetXProviderBloc供给一个简略的运用示例和相关API的代码展现。

GetX

示例: 运用GetX进行状况办理

// 界说一个呼应式的状况类
class CounterController extends GetxController {
  var count = 0.obs;
  void increment() => count++;
}
// 在你的UI代码中运用它
Obx(() => Text('Count: ${Get.find<CounterController>().count}'))

API: .obsObx

  • .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: ChangeNotifierConsumer

  • ChangeNotifier 是一个能够告诉监听器关于改动的类。
  • Consumer<T> 用于在需求的当地监听ChangeNotifier
    当然,ProviderBloc也有自己的一系列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: BlocBlocBuilder

  • 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)ConsumerSelectorWidget来查找和监听数据模型。这些API使得在Widget树的任何位置访问和监听数据变得简略。

特色:

  • 简化了数据的传递和监听进程。
  • 运用Flutter结构内置的功用,避免额外的性能开支。
  • 愈加符合Flutter的呼应式编程范式

Bloc

原理:

  • 事情驱动: Bloc(Business Logic Component)运用了事情驱动的概念,经过接收事情、处理它们并输出新状况的方式来办理状况。这种形式有助于将事务逻辑从UI层别离出来,使得状况办理愈加清晰和可猜测。
  • 流(Streams): Bloc库运用Dart的Streams来处理异步事情流。状况的改动是经过监听事情流并产生新的状况流来完成的。这答应开发者对杂乱的异步操作序列有很好的操控。

特色:

  • 强调了状况办理和事情处理的别离。
  • 运用Stream能够十分合适处理杂乱的异步逻辑。
  • 有助于构建可猜测的状况办理流程,尤其是在大型应用程序中。

总结:

  • GetX更像是一个全能型的解决方案,它供给了状况办理、依靠注入和路由办理的功用,且易于上手和运用。
  • Provider更依靠于Flutter结构的特性,它经过InheritedWidget和ChangeNotifier供给了一个较为简练的状况办了解决方案,但或许需求更多的模板代码。
  • Bloc供给了一种更结构化的状况办理方法,经过将事务逻辑与UI别离,使得代码愈加可保护,但它的学习曲线或许比另外两者稍峻峭。

开发者能够依据项目的巨细、团队的经历以及对上述概念的偏好来挑选最合适的东西。