从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可读脚本