環境
zsh 5.8,
macOS 11.2.2,
flutter doctorの結果
[✓] Flutter (Channel stable, 1.22.5, on macOS 11.2.2 20D80 darwin-x64, locale ja-JP)
[✓] Android toolchain - develop for Android devices (Android SDK version 30.0.2)
[✓] Xcode - develop for iOS and macOS (Xcode 12.4)
[✓] Android Studio (version 4.1)
[✓] Android Studio (version 4.1)
[✓] Connected device (1 available)
• No issues found!
質問の概要
質問させていただきます。
現在TODOアプリを作成しております。TODOのデータをSharedPreferencesを使い保存、削除を行っています。
TODOを追加して(ビルド)保存の確認はできますが、TODOを複数追加して、1つ削除(ビルド)すると他のTODOまで消えてしまう事象が発生し、解決に詰まってしまいました。
コード
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:todo_app/todo/todo_detail.dart';
class TodoPage extends StatefulWidget {
@override
_TodoPageState createState() => _TodoPageState();
}
class _TodoPageState extends State<TodoPage> {
// Todoリストのデータ
List<String> todoList = [];
void _increment() async {
setState(() {
_setStringList(); // Shared Preferenceに値を保存する。
});
}
void _setStringList() async {
final SharedPreferences pref = await SharedPreferences.getInstance();
await pref.setStringList('todo', todoList);
}
void _getStringList() async {
final SharedPreferences pref = await SharedPreferences.getInstance();
setState(() {
todoList = pref.getStringList('todo') ?? [];
});
}
// Shared Preferenceのデータを削除する
_remove() async {
SharedPreferences pref = await SharedPreferences.getInstance();
setState(() {
pref.remove('todo');
});
}
@override
void initState() {
super.initState();
_getStringList();
}
@override
Widget build(BuildContext context) {
return Scaffold(
// データを元にListViewを作成
body: ListView.builder(
itemCount: todoList.length,
itemBuilder: (context, index) {
final todo = todoList[index];
///削除 return Dismissible( key: Key(todo), onDismissed: (direction) { setState(() { _remove(); todoList.removeAt(index); }); }, background: Container( color: Colors.redAccent, ), child: Card( child: ListTile( title: Text(todoList[index]), ), )); }, ), floatingActionButton: Padding( padding: const EdgeInsets.only(bottom: 80), child: FloatingActionButton( onPressed: () async { // "push"で新規画面に遷移 // リスト追加画面から渡される値を受け取る final newListText = await Navigator.of(context).push( MaterialPageRoute(builder: (context) { // 遷移先の画面としてリスト追加画面を指定 return TodoDetail(); }), ); if (newListText != null) { setState(() { todoList.add(newListText); _increment(); }); } }, child: Icon(Icons.add), ), ), );
}
}
遷移先
import 'package:flutter/material.dart';
class TodoDetail extends StatefulWidget {
@override
_TodoDetailState createState() => _TodoDetailState();
}
class _TodoDetailState extends State<TodoDetail> {
///入力したデータをテキストとしてもつ。
String _text = '';
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('TODO追加'),
backgroundColor: Colors.blue,
),
body: Container(
padding: EdgeInsets.all(30),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
_text,
style: TextStyle(color: Colors.blue),
),
TextField(
onChanged: (String value) {
setState(() {
_text = value;
});
},
),
RaisedButton(
child: const Text('追加'),
color: Colors.grey,
onPressed: () {
Navigator.of(context).pop(_text);
},
)
],
),
),
);
}
}
参考にした記事など
https://qiita.com/kazumaz/items/79c9f4c553d638d555b4
https://www.virment.com/how-to-use-shared-preferences-in-flutter/
デバッグ内容と自身の考察
配列ごと消している
最新の情報に更新する
あなたの回答
tips
プレビュー