Flutter 建议的数据流(导入/导出)

Flutter 建议的数据流(导入/导出),flutter,dart,Flutter,Dart,我有一个颤振应用程序,它(简单地说)在各种屏幕上列出一些数据,并且可以修改。我目前的数据方法是有效的,但我觉得它不是最佳实践或最佳方法 当前,保存对象时,它会转换为JSON(使用dart:convert)并存储在设备上的文件中(使用dart.io),如果文件存在,则会覆盖该文件。每个需要显示这些对象的屏幕都会读取文件以获取对象。每次需要保存更改时,它都会再次导出(覆盖)所有内容,然后再次导入以显示更改 我之所以选择JSON而不是S,是因为我想稍后添加一个web部分。这种阅读/写作方法是最佳实践吗

我有一个颤振应用程序,它(简单地说)在各种屏幕上列出一些数据,并且可以修改。我目前的数据方法是有效的,但我觉得它不是最佳实践或最佳方法

当前,保存对象时,它会转换为JSON(使用
dart:convert
)并存储在设备上的文件中(使用
dart.io
),如果文件存在,则会覆盖该文件。每个需要显示这些对象的屏幕都会读取文件以获取对象。每次需要保存更改时,它都会再次导出(覆盖)所有内容,然后再次导入以显示更改

我之所以选择JSON而不是S,是因为我想稍后添加一个web部分。这种阅读/写作方法是最佳实践吗?我觉得对大多数屏幕的所有数据进行如此多的读/写可能会导致一些性能问题


任何建议都将不胜感激

这是一种在更改数据模型/设置时将数据保存在内存中并写入磁盘的可能方法

我用我自己。你不需要它本身,尽管它确实让生活更轻松。我将简化下面的示例,以便您了解该概念并将其应用于您自己的需要

假设您跟踪设置类中的数据:

@JsonSerializable()
班级设置{
字符串someData1;
字符串someData2;
//json可串行化函数
}
您需要一个“处理程序”1或类似的东西来管理对
设置所做的更改以及读/写数据:

类设置程序{
设置\u设置;
StreamController_settingsController=BehaviorSubject();
StreamController_data1Controller=BehaviorSubject();
StreamSink get data1Input=>\u data1Controller.sink;
Observable get data1Output=>Observable(\u data1Controller.stream);
Future\u readFromDisk()异步{
//做你的事
}
未来写入磁盘(设置)异步{
//做你的事
}
Future init()异步{
//从磁盘读取
_设置=等待_readFromDisk();
_settingsController.sink.add(\u设置);
//初始化数据
data1Input.add(\u settings.someData1);
数据1输出
.skip(1)//我们跳过了,因为我们刚刚在上面添加了初始化数据。
.listen((值)=>
//我们必须通过update函数进行传播
//否则,不会将任何内容写入磁盘
更新((设置)=>settings.someData1=value)
);
//当进行更改时,它需要通知此流
//所以一切都可以写入磁盘
_settingsSaver.output
//发生更改时,每2.5秒保存一次设置。
.debounceTime(常数持续时间(毫秒:2500))
//获取更改并写入磁盘
.listen((设置)=>_writeToDisk(设置));
}
//此功能至关重要,因为它允许通过[adjustFunc]进行更改
//然后将其传播到_settingsAver流中。
作废更新(作废功能(设置输入)adjustFunc){
adjustFunc(_设置);
_settingsSaver.sink.add(_设置);
}
}
所以现在你可以做一些类似的事情

var handler=SettingsHandler();
wait handler.init();
//这个
handler.data1Input.add('NewData');
//还是这个
handler.update((设置){
settings.someData1='NewData';
});
请记住,此代码仅显示概念如何工作。你需要根据你的情况改变它。您也可以决定不公开
data1Input
update(…)
函数,这取决于您自己的设计



1我个人使用BloC,您的情况可能需要另一种方式。

为什么不将其保存在内存中,并在更改数据模型时将其写入?这实际上取决于您写入的数据量。您是否注意到任何性能问题?json文件有多大?@kent目前,一个对象小于1000个字符(在线)。大多数人一次会使用10个左右的对象(约10000个字符),而最多可能是100个对象(100000个字符)。我还没有测试过性能,但是如果我要保留这个方法,我会把它列在我的清单上。@贪婪的这是有意义的,现在看起来很明显。我唯一担心的是用户关闭应用程序而不保存,但我发现如果需要,我可以在关闭时强制保存—没有理由你不能将其保存在ram中,并在发生更改时自动将其保存到磁盘。确保在异步线程上执行I/O,这样您的UI就不会被占用。大多数iOS应用程序不会明确要求用户按下保存按钮,这只是碰巧发生的。