重启应用程序后如何保存应用程序数据 - 颤动?

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

以上是关于重启应用程序后如何保存应用程序数据 - 颤动?的主要内容,如果未能解决你的问题,请参考以下文章

当用户从颤动的单选按钮组中选择单选按钮时如何保存数据?

如何在不使用共享首选项的情况下将数据存储为颤动的对象[关闭]

应用重启后如何重新加入演员会话?

如何在颤动中自动注销firebase用户?

如何在颤动应用程序中隐藏单击按钮?

Spring Boot在开发时实现热部署(开发时修改文件保存后自动重启应用)