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 }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。