0

我正在尝试制作一个简单的应用程序来发送/接收 SMS 并将数据存储在 noSQL 数据库中。作为小型数据库,我选择了sembast

然后出现了一些问题。

  1. 几乎所有示例都是针对旧版本的颤振,因此 null-safety 会阻止获取应用程序的工作示例。在花了一天无用的努力使代码正确之后,我找到了另一个例子。
  2. 在作者的github 页面上有一个工作示例,但它是以流直接馈送到 UI 的方式编写的。无论如何,我想通过使用 cubits 的bloc架构来保留数据层抽象。

弄清楚如何通过 cubit->emit 调用转发流并不是什么大问题,但是这段代码让我有点困惑:

Future<void> init({required String packageName}) async {


WidgetsFlutterBinding.ensureInitialized();
  platformInit();
  // For dev, find the proper sqlite3.dll
  if (!kIsWeb) {
    sqflite.sqfliteWindowsFfiInit();
  }
  var databaseFactory = getDatabaseFactory(packageName: packageName);
    
  noteProvider = DbNoteProvider(databaseFactory);
  // devPrint('/notepad Starting');
  await noteProvider.ready;
  runApp(MyApp());
}

核心问题是我无法弄清楚这个getDatabaseFactory方法来自哪里,而在我的应用程序中它只是给出了Method not found: 'getDatabaseFactory'.

我唯一设法找到的主题是在某些数据库上提到这种 Java 方法。

另一方面,克隆和运行 ( flutter run) 初始笔记本示例运行正常。当我尝试转储结果时,getDatabaseFactory它给了我Instance of 'DatabaseFactoryWeb'.

问题是:

  1. 有没有简单的方法来解决这个问题getDatabaseFactory?也许我想念依赖?
  2. 有没有办法简化整个note_provider?这似乎有点过于复杂。
  3. 如果您对如何not_provider通过bloc架构进行工作有提示,那就太好了。现在的计划是监听onNotesStream 并在事件中发出“notes”列表,以便 UI 重绘小部件。

先感谢您。

4

1 回答 1

2

免责声明:我是 sembast 和示例的作者

我不怪你,文档很差......不过我可能不会回答你所有的问题。

一些解释

工厂是我主要从 java 世界中得到的一个概念。它成为库的主要入口点,即 sembastDatabaseFactory允许您打开和删除数据库。

通常,您会根据目标(移动设备、Web、桌面)在应用程序中使用单个工厂,工厂可能会有所不同。

默认情况下,sembast 有一个databaseFactoryMemory不持久化数据和一个基本databaseFactoryIo 实现在文件系统(移动、桌面、DartVM)之上使用基本 json 文件实现(这不是跨进程安全的,即如果 2 个应用程序在同一个数据库上写入,您可能会丢失数据)。

显然,这不适用于 Web 上的持久性,因此该包sembast_web暴露 databaseFactoryWeb在 indexed_db 之上,并且是跨表安全的。

在 IO 应用程序(flutter web/mobile,DartVM)上,我的建议是使用sembast_sqflite 在 sqflite 之上实现 sembast,这是跨进程安全的(即没有损坏)。

颤振的 git 项目tekartik_app_sembast 提出了使用getDatabaseFactory()导出方法在所有平台上获取正确工厂的任何意见实现(即它将sembast_web在​​网络上使用,并sembast_sqflite用于移动/桌面)。该实现作为示例可用,您可以使用 package.json 决定桌面上的不同数据库位置 path_provider

一些回应

  1. 有没有一种简单的方法来修复这个 getDatabaseFactory?也许我想念依赖?

这是我在上面解释的示例 pubspec 中声明的 git 依赖项,可在此处作为参考:https ://github.com/tekartik/app_flutter_utils.dart/tree/master/app_sembast

  1. 有没有办法简化整个note_provider?这似乎有点过于复杂。

这只是一个典型的例子。通常我抽象数据库接口以允许切换到不同的实现。但是你可以看到sembast guide for reading and writing data。

  1. 如果您有提示如何通过 bloc 架构使 not_provider 工作,那就太好了

很难为所有现有架构(bloc、rxdart、provider)举一个例子。sembast 在编写、阅读和监听更改方面与 firestore 有一些相似之处,您可能会发现更多使用 firestore 的示例(最后您只是读/写/听)

于 2021-09-29T15:18:06.343 回答