重启应用程序后如何保存应用程序数据 - 颤动?
Posted
技术标签:
【中文标题】重启应用程序后如何保存应用程序数据 - 颤动?【英文标题】:How to save app data after restart of an app - flutter? 【发布时间】:2021-10-01 15:40:55 【问题描述】:我想知道如何让我的应用在重启后保存数据? (用户可以删除任务并将新任务添加到列表中,以及选中任务已完成的框。我希望应用程序保存此数据,因此当用户存在应用程序时,它将显示他离开的所有任务应用程序)
我在谷歌上阅读了几个小时,我必须 [1]:https://flutter.dev/docs/cookbook/persistence/reading-writing-files 有人在类似帖子中推荐此链接。但是读完之后,我有点困惑从哪里开始我的应用程序。
包括我的一些代码,如果您能帮助我,我将不胜感激,因为在阅读和观看教程数小时后,我仍然不确定从哪里开始或哪种方式最好。
我的 main.dart 是这个
void main()
runApp(MyApp());
class MyApp extends StatelessWidget
@override
Widget build(BuildContext context)
return ChangeNotifierProvider(
create: (context) =>
TaskData(), //changing builder: to create: fixed the errors i been having
child: MaterialApp(
home: TasksScreen(),
),
);
class TaskData extends ChangeNotifier
List<Task> _tasks = [
Task(name: "Sample task 1"),
Task(name: "Sample task 2"),
Task(name: "Sample task 3"),
];
UnmodifiableListView<Task> get tasks
return UnmodifiableListView(_tasks);
int get taskCount
return _tasks.length;
void addTask(String newTaskTitle)
final task = Task(name: newTaskTitle);
_tasks.add(task);
notifyListeners();
void updateTask(Task task)
task.toggleDone();
notifyListeners();
void deleteTask(Task task)
_tasks.remove(task);
notifyListeners();
非常感谢!
【问题讨论】:
【参考方案1】:基本方法是使用设备本地存储。
1 - 在您的 pubspec.yaml 中添加 shared_preferences 2 - 创建一个类来写入和读取数据:
import 'dart:convert';
import 'package:shared_preferences/shared_preferences.dart';
class StoreData
StoreData._privateConstructor();
static final StoreData instance = StoreData._privateConstructor();
Future<void> saveString(String key, String value) async
try
SharedPreferences pref = await SharedPreferences.getInstance();
final encodedValue = base64.encode(utf8.encode(value));
pref.setString(key, encodedValue);
catch (e)
print('saveString $e.toString()');
Future<String> getString(String key) async
SharedPreferences pref = await SharedPreferences.getInstance();
final value = pref.getString(key) == null ? '' : pref.getString(key);
if (value.length > 0)
final decodedValue = utf8.decode(base64.decode(value));
return decodedValue.toString();
return '';
Future<bool> remove(String key) async
SharedPreferences pref = await SharedPreferences.getInstance();
return pref.remove(key);
3 使用:
保存数据:
StoreData.instance.saveString('name', 'sergio');
检索数据:
final String storedName = await StoreData.instance.getString('name');
print('The name is $storedName');
我们有很多其他的方法,比如在后端使用 SQlite、NoSql 或数据库,但本地存储是最基本的情况
【讨论】:
您好,谢谢您的回复。问题,我应该在 main.dart 的哪里实现这个代码,在我有列表的 task_data 中,还是创建全新的 dart 文件? 或者我将保存数据放在哪里,并检索数据代码? (不知道如何使用代码) 我的建议...在一个新的类(新的 dart 文件)中实现并调用你的需要。 对不起,我根本看不懂这段代码:|我对此完全陌生,我不知道这一切意味着什么,所以我不知道如何以及在哪里实施/如何编辑:|我想我需要再次谷歌或研究,或者只是忘记保存数据并稍微更改我的应用程序【参考方案2】:您需要的是数据库或基于文档的数据存储。您可以使用 sqflite
插件将数据存储在本地 sqlite 数据库中。或者您可以存储在 JSON 资产文件中。
您还可以使用服务器或云服务。 Firebase 很好地与 Flutter 集成,但 AWS 和 Azure 也很棒。
您可以将数据写入资产的文本文件中,但这会非常复杂。
【讨论】:
您好,感谢您的回复。我不知道如何在我的代码中实现 JSON 或 SQLITE,我阅读了网上找到的几个示例,但这让我很头疼。我找到了一些firebase教程,但它们通常包括注册和登录页面,我只想保存数据,你认为最简单的解决方案是什么:? 您可以查看sqflite
包上的文档:pub.dev/packages/sqflite
您也可以在您的资产文件夹中添加一个 JSON 文件,并将资产位置添加到您的 pubspec.yaml以上是关于重启应用程序后如何保存应用程序数据 - 颤动?的主要内容,如果未能解决你的问题,请参考以下文章