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

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

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

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

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

Dart

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

Q&A

解決済

1回答

1288閲覧

flutter オープンダイアログとTextFieldを使用した時間割アプリ

keeen

総合スコア15

Flutter

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

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

Dart

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

0グッド

0クリップ

投稿2021/07/02 13:10

編集2021/07/02 13:38

flutterで時間割アプリを作っていて、ガワはできたのですがデータ保存だけが上手くいきません。
時間割のボタンを押すとopenDialogが開き、TextFieldに入力されたデータをボタンのTextに反映させています。
https://teratail.com/questions/244144
このページを参考にshared_preferencesを使ったらopenDialog内のTextFieldのデータは保存されるのですが、ページをリロードした時にボタンのTextには保存したデータが反映されません。
以下が作成したプログラムです。短くするために、6×5個ある時間割ブロックのうちの一つだけを表示させています。長くてすみません...
保存したデータを、ページのリロードをした際にボタンのtextに反映させる方法をご存知でしたらご教授いただきたいです。

dart

1import 'package:flutter/material.dart'; 2import 'package:flutter/services.dart'; 3import 'package:shared_preferences/shared_preferences.dart'; 4 5void main() => runApp(MyApp()); 6 7class MyApp extends StatelessWidget { 8 final title = '時間割'; 9 10 Widget build(BuildContext context) { 11 return new MaterialApp( 12 debugShowCheckedModeBanner: true, 13 title: 'zikanwariApp', 14 home: Scaffold( 15 appBar: AppBar( 16 title: Text('時間割'), 17 ), 18 body: Column( 19 children: [ 20 Container( 21 child: Row( 22 mainAxisAlignment: MainAxisAlignment.spaceAround, 23 children: <Widget>[ 24 Text('09:10~'), 25 _MainPageState(), 26 ], 27 ), 28 ), 29 ], 30 ), 31 ), 32 ); 33 } 34} 35 36//ここから時間割のブロックのプログラム 37class _MainPageState extends StatefulWidget { 38 _MainPageState({Key? key}) : super(key: key); 39 40 _MainPageStateState createState() => _MainPageStateState(); 41} 42 43class _MainPageStateState extends State<_MainPageState> { 44 String _value = ''; 45 String _value1 = ''; 46 String _value2 = ''; 47 String _value3 = ''; 48 String title = ''; 49 String room = ''; 50 String teacher = ''; 51 String data = ''; 52 53 //データ編集用のコントローラ 54 final redController = TextEditingController(); 55 final yellowController = TextEditingController(); 56 final greenController = TextEditingController(); 57 58 59 void initState() { 60 super.initState(); 61 load(); 62 } 63 64 //データロード用関数 65 Future<void> load() async { 66 final prefs = await SharedPreferences.getInstance(); 67 redController.text = prefs.getString('red')!; 68 yellowController.text = prefs.getString('yellow')!; 69 greenController.text = prefs.getString('green')!; 70 } 71 72 //データ保存用関数 73 Future<void> save(key, text) async { 74 final prefs = await SharedPreferences.getInstance(); 75 await prefs.setString(key, text); 76 } 77 78 void _setValue(String value) { 79 setState(() { 80 _value = value; 81 }); 82 } 83 84 85 Widget build(BuildContext context) { 86 load(); 87 _setValue(_value1 + '\n' + _value2 + '\n' + _value3); 88 return new Container( 89 padding: new EdgeInsets.all(4.0), 90 child: new Center( 91 child: new Column( 92 children: <Widget>[ 93 SizedBox( 94 width: 60, 95 height: 80, 96 child: new ElevatedButton( 97 style: ElevatedButton.styleFrom( 98 primary: pickerColor, 99 onPrimary: Colors.white, 100 ), 101 onPressed: () { 102 openDialog(context); 103 }, 104 onLongPress: () { 105 colorDialog(context); 106 }, 107 child: new Text( 108 _value, 109 style: TextStyle( 110 fontSize: 10, 111 ), 112 ), 113 ), 114 ), 115 ], 116 ), 117 ), 118 ); 119 } 120 121 //授業名など指定関数 122 void openDialog(BuildContext context) { 123 showDialog( 124 context: context, 125 builder: (BuildContext context) { 126 var alertDialog = new AlertDialog( 127 title: new Text('授業を設定'), 128 content: new Column( 129 mainAxisSize: MainAxisSize.min, 130 children: <Widget>[ 131 new Container( 132 child: new TextField( 133 controller: redController, 134 keyboardType: TextInputType.multiline, 135 maxLines: 1, 136 autofocus: true, 137 decoration: new InputDecoration( 138 labelText: '科目名', 139 hintText: title, 140 ), 141 onChanged: (title) { 142 _value1 = title; 143 save('red', _value1); 144 }, 145 ), 146 ), 147 new Container( 148 child: new TextField( 149 controller: yellowController, 150 keyboardType: TextInputType.multiline, 151 maxLines: 1, 152 autofocus: true, 153 decoration: new InputDecoration( 154 labelText: '教室', 155 hintText: room, 156 ), 157 onChanged: (room) { 158 _value2 = room; 159 save('yellow', _value2); 160 }, 161 ), 162 ), 163 new Container( 164 child: new TextField( 165 controller: greenController, 166 keyboardType: TextInputType.multiline, 167 maxLines: 1, 168 autofocus: true, 169 decoration: new InputDecoration( 170 labelText: '担任', 171 hintText: teacher, 172 ), 173 onChanged: (teacher) { 174 _value3 = teacher; 175 save('green', _value3); 176 }, 177 ), 178 ), 179 ], 180 ), 181 actions: <Widget>[ 182 TextButton( 183 onPressed: () { 184 Navigator.of(context) 185 .pop(_value1 + '\n' + _value2 + '\n' + _value3); 186 _setValue(_value1 + '\n' + _value2 + '\n' + _value3); 187 }, 188 child: Text('OK'), 189 ), 190 TextButton( 191 onPressed: () { 192 Navigator.of(context).pop(); 193 }, 194 child: Text('キャンセル'), 195 ), 196 ], 197 ); 198 return alertDialog; 199 }, 200 ); 201 createDialogOption(BuildContext context, String str) { 202 return new SimpleDialogOption( 203 child: new Text(str), 204 onPressed: () { 205 Navigator.pop(context); 206 }, 207 ); 208 } 209 }

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

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

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

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

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

guest

回答1

0

自己解決

@override
Widget build(BuildContext context) {
load();
_setValue(redController.text + '\n' + yellowController.text
+ '\n' + greenController.text
);

太字の部分を変更することで解決しました!!

投稿2021/07/02 13:42

keeen

総合スコア15

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問