【问题标题】:Flutter + Sembast + streams + cubits颤振 + Sembast + 溪流 + 腕尺
【发布时间】:2021-11-20 09:44:18
【问题描述】:

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

然后出现了一些问题。

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

弄清楚如何通过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. 如果您有关于如何通过bloc 架构使not_provider 工作的提示,那就太好了。目前的计划是收听onNotes Stream 并在事件中发出“注释”列表,以便 UI 重绘小部件。

提前谢谢你。

【问题讨论】:

    标签: flutter dart nosql bloc sembast


    【解决方案1】:

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

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

    一些解释

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

    通常,您会在应用程序中使用单个工厂,具体取决于目标(移动设备、网络、桌面)、工厂 可能会有所不同。

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

    显然这不适用于 web 上的持久性,因此包 sembast_web 暴露 databaseFactoryWeb 在 indexed_db 之上工作,并且是交叉表安全的。

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

    flutter git 项目tekartik_app_sembast 为在所有平台上获得合适的工厂提出任何建议的实施方案 使用getDatabaseFactory() 导出的方法(即它将在​​网络上使用sembast_web,在移动/桌面上使用sembast_sqflite)。 该实现作为示例可用,您可以使用桌面上的不同数据库位置来决定 path_provider 包。

    一些回应

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

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

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

    这只是一个选择性的例子。通常我抽象数据库接口以允许切换到不同的实现。但是您可以看到sembast guide 用于读取和写入数据。

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

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

    【讨论】:

    • 感谢您的快速答复。
    猜你喜欢
    • 2020-12-16
    • 2022-11-18
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 2021-05-04
    • 2022-08-09
    • 2021-10-30
    • 2020-09-20
    相关资源
    最近更新 更多