从0开始设计与颤振无关的App|第1部分:数据库和状态管理
UI设计
浏览:1038 次

鉴于Flutter的高性能渲染和跨平台优势,使用完整的Flutter框架在移动APP上开发了闪光点列表。因为它是一个完整的APP,所以架构不受历史原生APP的影响,而且设计可以更加灵活和健壮,而不需要历史负担。
颤振
首先,列出一些闪点列表的业务特征(更一般的业务特征):
具有大量数据的本地库存数据离线可用且未登录;登录后需要服务器数据同步
有许多状态更改场景,前端状态逻辑复杂,跨页面和跨组件状态更新频繁
对于这些业务点,设计的技术选择包括:本地数据库、前端状态管理。对于许多企业来说,这些都是核心问题,也是我们今天讨论的焦点。
数据库选择
对于数据库选择,第一步是选择数据库类型:关系数据库、非关系数据库或键/值存储。
对于关系数据库,您可以选择SQLite、Core Data、GreenDao等;对于非关系数据库,Realm和UnQLite可用;对于密钥/值存储,有Redis、Berkeley DB、Level DB等。
由于业务表单具有复杂的查询场景,因此首先排除键/值存储;然后,鉴于频繁的业务迭代和数据结构的巨大变化,完整关系数据库的使用成本将更高。更新版本时,应在数据兼容性和数据清理方面做更多工作;因此,我们采用了支持JSON类型的NoSQL数据库或关系数据库。
Flutter目前在NoSQL上的选项很少,Realm、UnQLite等都不支持(当然,它可以通过Flutter FFI封装到Dart,但成本太高);Flutter的sqllite插件可以更好地支持SQLite,但由于SQLite仅支持3.9之后的JSON数据,考虑到Android版本()的兼容性,我们不使用sqllite;我们最终使用的数据库是NoSQL,它仍然相对较小,但具有良好的性能和API结构。
颤振
Semcast简介
Semcast API很简单,但它可以支持更复杂的数据库操作。
在数据查询中,可以通过简单的逻辑API和聚合来构造复杂的逻辑查询语句;数据排序实现也相对完整,支持多字段排序(但不支持布尔类型排序);它还支持事务操作;支持整数自动递增键。
一些Semcast API预览
var store=intMapStoreFactory.store('imals');
//事务处理
等待数据库。事务((txn)异步{

等待商店。添加(txn,{'名称':'鱼'});
等待商店。add(txn,{'name':'cat'});
等待商店。添加(txn,{“name”:“dog”});
});
//数据查询
var finder=查找器(
filter:过滤器。大于(“名称”、“猫”),
排序顺序:[SortOrder('name')]);
var记录=等待存储。查找(db,finder:查找器);
expect(records.length,2);
expect(记录[0]['name'],'dog');
expect(记录[1][“名称”],“鱼”);
然而,出于对利基数据库未来的担忧,我们设计了一个易于迁移的数据架构,并为数据操作层做了一层抽象。如果稍后迁移数据库,则业务层可以完全不变。
状态管理模式选择
状态管理是当今前端技术的一个非常重要的部分。一个好的状态管理框架可以更好地解耦业务,简化组件数据通信成本,并大大改善开发体验。我们花了更多的时间来选择州管理模式,以比较各种方案,如、、、,甚至是行业网红团队的方案。我们最终采用了mobx。我们无法完成一篇关于各种方案比较的文章。我们最终选择了mobx,因为它的API更友好。
Mobx使用注释来定义状态,并封装小部件以更新小部件的数据。学习和使用成本低。
技术
注释定义
Mobx注释的使用与Web中的Vue非常相似,例如:

使用@observate注释属性,表示需要监视它。Mobx将自动为其添加getter和setter
使用@computed注释计算属性
使用@action注释方法以修改存储,类似于Vuex中的突变
示例代码:
import'包:mobx/mobx.dart';
部分“counter.g.dart”;
class Counter=带有_$Counter的CounterBase;
带存储的抽象类CounterBase{
@可观察的
int值=0;
@计算的
int获取allowCount{
返回值*2;
}
@动作
无效增量(){
值++;
}
}

使用Mobx的必要步骤之一是预编译步骤。我们需要在预编译阶段将Mobx状态脚本编译为dart可读脚本