首页 > 其他分享 >Flutter中多种状态管理方案

Flutter中多种状态管理方案

时间:2023-09-12 15:01:36浏览次数:57  
标签:方案 return 状态 Text 多种 class extends context Flutter

Flutter中有多种状态管理方案,用于管理应用程序中的状态和数据,以确保应用的可维护性和可扩展性。以下是一些常见的Flutter状态管理方法:

  1. setState: 这是Flutter中最基本的状态管理方法。在StatefulWidget中,可以使用setState方法来通知Flutter框架,界面需要被重新绘制,以反映状态的变化。这适用于简单的状态管理,但在大型应用中可能会导致代码冗长和难以维护。
  2. Provider: Provider是一个轻量级的状态管理解决方案,使用InheritedWidget来共享状态。它允许将状态注入到Widget树中的任何位置,并在状态变化时通知依赖项进行更新。Provider适用于中小型应用,以及需要在多个层级共享状态的情况。
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

void main() {
  runApp(MyApp());
}

class CounterModel extends ChangeNotifier {
  int _count = 0;

  int get count => _count;

  void increment() {
    _count++;
    notifyListeners();
  }
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider(
      create: (context) => CounterModel(),
      child: MaterialApp(
        home: MyHomePage(),
      ),
    );
  }
}

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final counterModel = Provider.of<CounterModel>(context);

    return Scaffold(
      appBar: AppBar(
        title: Text('Provider Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text('Count:', style: TextStyle(fontSize: 24)),
            Text('${counterModel.count}', style: TextStyle(fontSize: 48)),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          counterModel.increment();
        },
        child: Icon(Icons.add),
      ),
    );
  }
}
  1. BLoC(Business Logic Component): BLoC是一种使用Streams管理状态和业务逻辑的模式。通过将界面层与业务逻辑层分开,BLoC模式使得代码更易于维护和测试。在Flutter中,可以使用bloc包来实现BLoC模式。
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';

void main() {
  runApp(MyApp());
}

class CounterCubit extends Cubit<int> {
  CounterCubit() : super(0);

  void increment() => emit(state + 1);
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: BlocProvider(
        create: (context) => CounterCubit(),
        child: MyHomePage(),
      ),
    );
  }
}

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final counterCubit = context.watch<CounterCubit>();

    return Scaffold(
      appBar: AppBar(
        title: Text('BLoC Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text('Count:', style: TextStyle(fontSize: 24)),
            Text('${counterCubit.state}', style: TextStyle(fontSize: 48)),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          counterCubit.increment();
        },
        child: Icon(Icons.add),
      ),
    );
  }
}
  1. Redux: Redux是一个流行的状态管理模式,强调单一状态源和不可变的状态。在Flutter中,可以使用reduxflutter_redux等库来实现Redux模式。Redux适用于需要管理大量复杂状态的应用。
import 'package:flutter/material.dart';
import 'package:flutter_redux/flutter_redux.dart';
import 'package:redux/redux.dart';

// Actions
enum Action { Increment }

// Reducer
int reducer(int state, dynamic action) {
  if (action == Action.Increment) {
    return state + 1;
  }
  return state;
}

void main() {
  final store = Store<int>(reducer, initialState: 0);

  runApp(MyApp(store: store));
}

class MyApp extends StatelessWidget {
  final Store<int> store;

  MyApp({required this.store});

  @override
  Widget build(BuildContext context) {
    return StoreProvider(
      store: store,
      child: MaterialApp(
        home: MyHomePage(),
      ),
    );
  }
}

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Redux Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            StoreConnector<int, String>(
              converter: (store) => store.state.toString(),
              builder: (context, count) {
                return Text('Count:', style: TextStyle(fontSize: 24));
              },
            ),
            StoreConnector<int, String>(
              converter: (store) => store.state.toString(),
              builder: (context, count) {
                return Text(count, style: TextStyle(fontSize: 48));
              },
            ),
          ],
        ),
      ),
      floatingActionButton: StoreConnector<int, VoidCallback>(
        converter: (store) {
          return () => store.dispatch(Action.Increment);
        },
        builder: (context, callback) {
          return FloatingActionButton(
            onPressed: callback,
            child: Icon(Icons.add),
          );
        },
      ),
    );
  }
}
  1. GetX: GetX是一个新兴的状态管理和依赖注入解决方案,它提供了一个简单而强大的方法来管理状态和路由导航。GetX通过反应式编程实现状态管理,并且具有高性能和低学习曲线的特点。
import 'package:flutter/material.dart';
import 'package:get/get.dart';

void main() {
  runApp(MyApp());
}

class CounterController extends GetxController {
  var count = 0.obs;

  void increment() {
    count++;
  }
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return GetMaterialApp(
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  final CounterController counterController = Get.put(CounterController());

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('GetX Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Obx(() => Text('Count:', style: TextStyle(fontSize: 24))),
            Obx(() => Text('${counterController.count}', style: TextStyle(fontSize: 48))),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          counterController.increment();
        },
        child: Icon(Icons.add),
      ),
    );
  }
}
  1. Riverpod: Riverpod是Provider的一种替代方案,旨在提供更简单、更强大的状态管理方式。它建立在Provider之上,提供了更直观的API和更强大的功能。
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';

void main() {
  runApp(MyApp());
}

final counterProvider = StateNotifierProvider<CounterNotifier, int>((ref) {
  return CounterNotifier();
});

class CounterNotifier extends StateNotifier<int> {
  CounterNotifier() : super(0);

  void increment() {
    state++;
  }
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ProviderScope(
      child: MaterialApp(
        home: MyHomePage(),
      ),
    );
  }
}

class MyHomePage extends ConsumerWidget {
  @override
  Widget build(BuildContext context, ScopedReader watch) {
    final count = watch(counterProvider);

    return Scaffold(
      appBar: AppBar(
        title: Text('Riverpod Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text('Count:', style: TextStyle(fontSize: 24)),
            Text('$count', style: TextStyle(fontSize: 48)),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          context.read(counterProvider.notifier).increment();
        },
        child: Icon(Icons.add),
      ),
    );
  }
}
  1. MobX: MobX是一个状态管理库,旨在使状态管理变得简单和直观。它使用反应式编程来管理状态和触发界面更新。
import 'package:flutter/material.dart';
import 'package:mobx/mobx.dart';
import 'package:flutter_mobx/flutter_mobx.dart';

void main() {
  runApp(MyApp());
}

class CounterStore = _CounterStore with _$CounterStore;

abstract class _CounterStore with Store {
  @observable
  int count = 0;

  @action
  void increment() {
    count++;
  }
}

class MyApp extends StatelessWidget {
  final CounterStore counterStore = CounterStore();

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MyHomePage(counterStore: counterStore),
    );
  }
}

class MyHomePage extends StatelessWidget {
  final CounterStore counterStore;

  MyHomePage({required this.counterStore});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('MobX Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text('Count:', style: TextStyle(fontSize: 24)),
            Observer(
              builder: (_) {
                return Text('${counterStore.count}', style: TextStyle(fontSize: 48));
              },
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          counterStore.increment();
        },
        child: Icon(Icons.add),
      ),
    );
  }
}

下面是对Provider、BLoC、Redux、GetX、Riverpod和MobX等Flutter状态管理库的一些对比:

Provider:

  • 适用场景: 适用于中小型应用,需要在多个层级共享状态的场景。
  • 特点: 轻量级,使用InheritedWidget来共享状态,支持各种类型的状态,易于上手。
  • 优势: 简单易用,不需要大量的额外代码,具有高性能,适用于简单的状态共享。
  • 劣势: 在大型应用中可能难以管理复杂的状态。

BLoC:

  • 适用场景: 适用于复杂的应用,需要分离业务逻辑和UI的场景。
  • 特点: 通过Streams管理状态和业务逻辑,将界面层与业务逻辑层分开,适合中大型应用。
  • 优势: 适合处理复杂的状态变化和异步操作,便于测试和维护。
  • 劣势: 在简单应用中可能显得过于复杂。

Redux:

  • 适用场景: 适用于需要管理大量复杂状态的应用。
  • 特点: 基于单一状态源和不可变状态,通过Actions和Reducers来管理状态变化。
  • 优势: 严格的状态管理,适用于大型应用,具有强大的开发工具和中间件。
  • 劣势: 在小型应用中可能过于繁琐,学习曲线较陡。

GetX:

  • 适用场景: 适用于快速开发和中小型应用,需要轻量级状态管理和依赖注入的场景。
  • 特点: 简单易用,提供状态管理、依赖注入和路由导航的综合解决方案。
  • 优势: 低学习曲线,高性能,适用于快速迭代的小型项目。
  • 劣势: 对于大型复杂应用,可能需要更复杂的状态管理方案。

Riverpod:

  • 适用场景: 适用于需要更强大、更简单的状态管理和依赖注入的场景。
  • 特点: 基于Provider的升级版本,提供更简单、更强大的API,支持多种状态管理模式。
  • 优势: 代码清晰,性能高效,支持多种状态管理模式,适用于各种规模的项目。
  • 劣势: 相对较新的库,社区可能还在成长。

MobX:

  • 适用场景: 适用于需要响应式编程和可观察对象的场景。
  • 特点: 通过可观察对象和反应式编程来管理状态,支持多种数据变化方式。
  • 优势: 简化了状态管理,具有响应式编程的特点,易于学习和使用。
  • 劣势: 相对较新的库,可能在一些大型项目中缺乏一些高级功能。

标签:方案,return,状态,Text,多种,class,extends,context,Flutter
From: https://blog.51cto.com/u_16175630/7445520

相关文章

  • Android静默安装实现方案
    之前有很多朋友都问过我,在Android系统中怎样才能实现静默安装呢?所谓的静默安装,就是不用弹出系统的安装界面,在不影响用户任何操作的情况下不知不觉地将程序装好。虽说这种方式看上去不打搅用户,但是却存在着一个问题,因为Android系统会在安装界面当中把程序所声明的权限展示给用户看,......
  • 智能远程监考方案助力企业考试化繁为简
    在音视频数字化之旅中,轻装上阵。 近年来,在数字化浪潮之下,远程考试频繁成为各领域热词,各企业也纷纷改革求新,将原本的企业内部考试转移到线上,从而获取更低廉的组考成本,更高的管理效率,以及更优质的考试体验。 新道科技,作为用友集团的重要成员企业,深耕数字教育领域,是国内领先的......
  • 关于Spring i18n国际化 报错No message found under code * for locale 'zh_CN'.的解
    第一步创建资源文件国际化文件命名格式:基本名称_语言_国家.properties 这里我建了两个配置文件,一个是zh_CN中文的,一个是en_GB英文的,然后在里面随便写点测试文本语句第二步bean.xmlspring配置文件1<?xmlversion="1.0"encoding="UTF-8"?>2<beansxmlns="http:/......
  • 振弦采集仪应用地下管道的优秀方案
    振弦采集仪应用地下管道的优秀方案随着城市化建设的不断推进,地下管道已经成为了城市中不可或缺的重要设施。地下管道包括市政供水管道、燃气管道、通信电缆等,它们的安全运行直接影响到人民生命财产安全和城市正常运转。因此,对管道的监测和检测显得尤为重要。传统的地下管道检测......
  • Redis 高效、安全的不停机数据迁移方案
    Redis是目前最流行的键值对存储数据库,凭借高性能和丰富的数据类型的特性,不仅可以作为缓存,还可以作为一个可持久化的数据库存储。随着业务的发展和版本的迭代,必然会遇到内存不足、集群节点不够和BUG等一系列问题。为了防止这些问题导致的系统故障,常常会把对内存、集群节点扩缩容......
  • 日常使用vscode开发flutter相关的插件
    简介这里整理了日常使用vscode开发flutter相关的插件,也有部分通用类型的插件Flutter&Dart这2个是flutter官方插件,开发flutter装机必备,不用多说。AwesomeFlutterSnippetsAwesomeFlutterSnippetsisacollectionsnippetsandshortcutsforcommonlyusedFlutterfunctions......
  • ClickHouse使用之四 ——外部数据源导入通用方案之insert into select from
    需求:1、在工作中,我们常常需要将外部hive或者mysql、oracle等数据源导入到clickhouse中,对于多种外部数据源,是否有通用的数据导入方案?2、我们在clickhouse上维持一张查询主表,但外部数据源表是hive增量表,新增数据需要同步更新到clickhouse上,是否有不通过第三方组件的插入方式......
  • MyBatisPlus插件访问不到云数据库的解决方案
      今天在学mybatis-plus时候了解到除了MybatisX插件外还有个大佬写的MyBatisPlus插件,个人感觉他默认自动生成代码的风格会比MybatisX插件更适合中国程序员,跳转的图标也比小鸟更合适。  但是在连接云数据库的时候出了问题,发现他根本连接不到云数据库,问了其他人,他们表示自己的......
  • Spring 循环依赖解决方案
    Spring解决循环依赖的思路与代码实现(qq.com)一文详解SpringBean循环依赖(qq.com)Spring循环依赖解决方案(qq.com)结论先说结论,Spring是通过三级缓存和提前曝光的机制来解决循环依赖的问题。两个BeanA,B互相引用循环依赖,Spring的解决过程如下:通过构建函数创建A对象(A对......
  • Redis 缓存击穿,缓存穿透,缓存雪崩原因+解决方案
    缓存击穿,缓存穿透,缓存雪崩的原因缓存击穿:key对应的数据存在,但在redis中过期,此时若有大量并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮。缓存穿透:key对应的数据在数据源并不存在,每次针对此key的请求从缓存......