为了弄懂Flutter的状态管理, 我用10种方法改造了counter app

本文详细介绍了使用Flutter进行状态管理的各种方法,包括Provider、BLoC(手动、传递、rxdart实现)、Flutter Redux、MobX等。通过具体的counter app例子,展示了如何实现和优化状态管理,探讨了各自的优缺点和性能细节。
摘要由CSDN通过智能技术生成

import ‘package:scoped_model/scoped_model.dart’;

class CounterModel extends Model {

int _counter = 0;

int get counter => _counter;

void increment() {

_counter++;

notifyListeners();

}

void decrement() {

_counter–;

notifyListeners();

}

}

其中数据变化的部分会通知listeners, 它们收到通知后会rebuild.

在上层初始化并提供数据类, 用ScopeModel.

访问数据有两种方法:

  • ScopedModelDescendant包裹widget.

  • ScopedModel.of静态方法.

使用的时候注意要提供泛型类型, 会帮助我们找到离得最近的上层ScopedModel.

ScopedModelDescendant(

builder: (context, child, model) {

return Text(

model.counter.toString(),

);

}),

数据改变后, 只有ScopedModelDescendant会收到通知, 从而rebuild.

ScopedModelDescendant有一个rebuildOnChange属性, 这个值默认是true.

对于button来说, 它只是控制改变, 自身并不需要重绘, 可以把这个属性置为false.

ScopedModelDescendant(

rebuildOnChange: false,

builder: (context, child, model) {

return FloatingActionButton(

onPressed: model.increment,

tooltip: ‘Increment’,

child: Icon(Icons.add),

);

},

),

scoped model这个库帮我们解决了数据访问和通知的问题, 但是rebuild范围需要自己控制.

  • access state

  • notify other widgets

  • minimal rebuild -> X -> 因为需要开发者自己来决定哪一部分是否需要被重建, 容易被忘记.

代码分支: scoped-model

Provider


Provider是官方文档的例子用的方法.

去年的Google I/O 2019也推荐了这个方法.

和BLoC的流式思想相比, Provider是一个观察者模式, 状态改变时要notifyListeners().

有一个counter版本的sample: https://github.com/flutter/samples/tree/master/provider_counter

Provider的实现在内部还是利用了InheritedWidget.

Provider的好处: dispose指定后会自动被调用, 支持MultiProvider.

Provider实现

  • model类继承ChangeNotifer, 也可以用with.

class CounterModel extends ChangeNotifier {

int value = 0;

void increment() {

value++;

notifyListeners();

}

void decrement() {

value–;

notifyListeners();

}

}

  • 数据提供者: ChangeNotifierProvider.

void main() => runApp(ChangeNotifierProvider(

create: (context) => CounterModel(),

child: MyApp(),

));

  • 数据消费者/操纵者, 有两种方式: Consumer包裹, 用Provider.of.

Consumer(

builder: (context, counter, child) => Text(

‘${counter.value}’,</

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值