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:

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

最后

如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。

如果你没有方向,这里给大家分享一套由阿里高级架构师编写的《Android八大模块进阶笔记》,帮大家将杂乱、零散、碎片化的知识进行体系化的整理,让大家系统而高效地掌握Android开发的各个知识点。
img
相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照知识体系编排的。

欢迎大家一键三连支持,若需要文中资料,直接扫描文末CSDN官方认证微信卡片免费领取↓↓↓

PS:群里还设有ChatGPT机器人,可以解答大家在工作上或者是技术上的问题

图片

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值