我想创建一个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);
}
}
答案 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);
}
}
我希望这些解决方案和评论能对您的挑战有所帮助。
让我知道这是否对您有用。