Flutter使用共享首选项将一些值添加到列表

时间:2020-09-28 17:01:32

标签: flutter

我想创建一个ToDo应用程序。我将任务输入到textField中,并使用setString保存该任务,并使用getString将其获取,并将其添加到我的列表中,但是当我向textField中输入新任务时,我的上一个值丢失了,只显示了新值。我该如何解决这个问题?

我的getString;

class TodoListState extends State<TodoList> {
  List<String> _todoItems = [];

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    getLocalData();
  }

  Future getLocalData() async {
    SharedPreferences preferences = await SharedPreferences.getInstance();
    setState(() => _todoItems.add(preferences.getString("key")));
  }

我的setString;

body: Column(children: [
          TextField(
            controller: itemcontroller,
            decoration: InputDecoration(
              labelText: " your task ",
            ),
          ),
          RaisedButton(
            child: Text("save the data"),
            onPressed: () {
              savetask().then((value) {
                Navigator.push(
                    context, MaterialPageRoute(builder: (context) => TodoApp()));
              });
            },
          ),
        ]));
  }

  Future savetask() async {
    /* liste.add(itemcontroller.text); */
    SharedPreferences preferences = await SharedPreferences.getInstance();
    await preferences.setString("key", itemcontroller.text);
  }
}

2 个答案:

答案 0 :(得分:0)

让我们看看你在做什么:

首先获取SharedPreferences上的内容。为了举例说明,让我们一无所有。然后,您在TextField中输入一个值。按下按钮后,字符串将保存在您的SharedPreferences中。之后,您输入另一个任务,并保存该值,将覆盖您正在使用的键。

那么,您应该怎么办? 将您提交的任务添加到列表中,然后将同一列表保存到SharedPreferences中。

因此,您应该这样做:

void savetask() async {
    _todoItems.add(itemcontroller.text);
    SharedPreferences preferences = await SharedPreferences.getInstance();
    await preferences.setString("key", _todoItems.toString());
  }

但是要当心! SharedPreferences不支持列表!它将另存为字符串。因此,我建议您使用sqflite,以便保留信息。但是该决定取决于您。

答案 1 :(得分:0)

我明白是什么问题。

SharedPreferences是Android中的sharePreference存储api和iOS的UsersDefaults的包装。两种api均仅将键值模式中的某些类型的简单数据存储在文件中。

以下是这两个api的文档:

https://developer.android.com/training/data-storage/shared-preferences?hl=es-419

https://developer.apple.com/documentation/foundation/userdefaults

这是flutter插件的文档:

https://pub.dev/packages/shared_preferences

关于您的问题,值是相同的,因为您使用相同的密钥存储数据。 (“键”)

您始终会为相同的键覆盖相同的值。要存储所有任务,必须为每次保存使用不同的键。

您需要使用以下方法:getStringList()和setStringList()

这里是一个示例,您可以如何修改getLocalData():

Future getLocalData() async {
    SharedPreferences preferences = await SharedPreferences.getInstance();

    setState((){ 
     
      _todoItems.clear();
      _todoItems.addAll(preferences.getStringList("key"));
});

}

这里是saveTask方法:

Future savetask() async {
    SharedPreferences preferences = await SharedPreferences.getInstance();
    var list = prefereces.getStringList("key");
    list.add(itemcontroller.text);
    await preferences.setStringList("key", list);
  }
} 

我希望这些解决方案和评论能对您的挑战有所帮助。

让我知道这是否对您有用。