文章目录
- 1. 概念介绍
- 2. 思路与方法
- 2.1 实现思路
- 2.2 相关组件
- 3. 示例代码
- 4. 内容总结
我们在上一章回中介绍了"使用get进行依赖管理"相关的内容,本章回中将介绍如何使用get进行状态管理一.闲话休提,让我们一起Talk Flutter吧。
1. 概念介绍
在Flutter开发中状态管理是必不可少的内容,我们在前面章回中介绍过这方面的内容,同时介绍了常用的状态管理组件:Provider.本章回中我们将介绍Get包中的状
态管理组件:GetBuilder,以及如何使用GetBuilder组件来管理状态。
2. 思路与方法
2.1 实现思路
使用GetBuilder组件实现状态管理的方法和使用Provider实现状态管理的方法类似,下面是具体的实现思路:
- 创建一个数据模型类,用来管理数据,通常用是创建GetxController类的子类;
- 在数据模型类中创建更新数据的方法,更新数据时调用父类的update方法;
- 在页面中使用GetBuilder组件监听数据变化,并且把更新后的数据同步到该组件中生成的组件上;
- 在页面中通过依赖管理获取到数据模型类对象, 并且调用调用更新数据的方法来更新数据;
上面介绍的实现思路比较抽象,我们将在后面的小节中通过示例代码来演示。如果大家熟悉Provider的话,就会发现该思路和Provider基本上一样,不一样的地方是该
思路中没有在main方法中设置providers,而是通过依赖管理来获取数据模型对象。还有就是一些细节上不同,比如,数据模型类的父类和监听数据更新的组件。稍后,
我们将对这些中用到的组件进行详细的介绍。
2.2 相关组件
在上面介绍的实现思路中我们用到了GetxController类,它类似ChangeNotifier类,主要用来管理数据的更新,它也提供了update()方法来更新数据模型中的数
据,该方法的功能和notifyListeners()方法完全相同。上面思路中使用的GetBuilder组件主要用来监听数据变化,并且把更新后的数据同步到该组件中生成的组件
上,它生成组件时通过builder属性来实现,这个属性的用法类似官方同名的属性。GetBuilder组件类似Consumer组件,它们的用法十分相似。我们在这里就展开介
绍了,大家看一下示例代码就能明白它的用法。
3. 示例代码
///这个是配合GetBuilder使用的数据模型类
class ValueController extends GetxController {
int iValue = 0;
String strValue = "default string";
///
void updateValue() {
iValue = 666;
strValue = "new String Value";
update();
}
}
///在页面中显示数据,页面中的数据会随着数据模型中的数据更新而更新
GetBuilder<ValueController>(
///init可以加也可以不加,GetBuilder会自动获取该对象
init: ValueController(),
builder: (controller) {
return Text("intValue: ${controller.iValue.toString()}, strValue: ${controller.strValue}");
}
),
///put方法通过依赖注入来初始化实例对象,然后更新数据
var getController = Get.put(ValueController());
getController.updateValue();
///使用了依赖管理技术获取实例并且更新数据
// Get.find<ValueController>().updateValue();
上面示例代码完全按照前面小节中的实现思路来编写,大家重点关注一下数据模型类的写法,GetBuilder生成子组件方法以及通过数据模型对象来更新数据的方法。我在
这里就不演示程序的运行结果了,建议大家亲自动手去实践,把更新数据的方法封装到按钮中,然后点击按钮就可以看到页面中的数据被更新了。
4. 内容总结
最后,我们对本章回中的内容做一个全面总结:
- Get包中通过GetBuilder和GetxController来实现状态管理功能,实现的思路和Provider包相似,只是实现细节不同;
- Get包中的状态管理使用了依赖管理技术,因此不需要专门设置providers,而且获取数据模型对象也比较方便,这些功能优于Provider包;
- Get包中的状态管理在性能上优于Provider包,不过这是官方文档的介绍,我没有做过具体的性能分析;
看官们,与"使用get进行状态管理"相关的内容就介绍到这里,欢迎大家在评论区交流与讨论!