【问题标题】: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();
  }

非常感谢!

【问题讨论】:

    标签: database flutter dart save


    【解决方案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
    猜你喜欢
    • 2017-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-13
    相关资源
    最近更新 更多