質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

Dart

Dartは、Googleによって開発されたJavaScriptの代替となることを目的に作られた、ウェブ向けのプログラミング言語である。

Q&A

0回答

1797閲覧

SharedPreferencesを使ってデータを削除するが、ビルドすると必要ない箇所まで消えてしまう。

A4UxdAF799hT6WT

総合スコア5

Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

Dart

Dartは、Googleによって開発されたJavaScriptの代替となることを目的に作られた、ウェブ向けのプログラミング言語である。

0グッド

0クリップ

投稿2021/04/06 05:40

環境

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/

デバッグ内容と自身の考察

配列ごと消している
最新の情報に更新する

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問