Flutterを勉強しております。
何となくウィジェットの配置の仕方などは覚えたのですが、
ソースコードを分割したりする方法がわかりません。
例えば下記のソースの場合、クリップボードにコピーする機能、時間を文字列で取得する機能、shared_preferencesを使う機能があります。
これらの機能は他Screenでも使用する可能性があるため、別のクラスとしてまとめておきたいです。
こういった場合の分割方法がわからないのですが、どのように実装すればよいのでしょうか。
クリップボードにコピーする機能、時間を文字列で取得する機能はMyClassなどで、shared_preferencesはSharedPreferencesControllerみたいなのを作って実装したいです。
実際に実装してみたのですが、下記ソースだと
The method '_saveListSharedPrefrences' isn't defined for the type 'SharedPreferencesController'.
Try correcting the name to the name of an existing method, or defining a method named '_saveListSharedPrefrences'.dartundefined_method
みたいなエラーが出てしまいます。
Dartで書くのが初めてで何かしらのアドバイスをいただけると嬉しいです。
Dart
1import 'package:flutter/material.dart'; 2import 'package:flutter/services.dart'; // クリップボード用 3import 'package:shared_preferences/shared_preferences.dart'; // 保存用 4import 'package:intl/intl.dart'; // DataFormat 5import 'dart:convert'; 6 7class ListScreen extends StatefulWidget { 8 ListScreen({Key key, this.title}) : super(key: key); 9 10 final String title; 11 12 13 _ListScreenState createState() => _ListScreenState(); 14} 15 16class _ListScreenState extends State<ListScreen> { 17 List<Model> modelList; 18 SharedPreferencesController spc = new SharedPreferencesController(); 19 20 21 // 起動時に初期化 22 void initState() { 23 super.initState(); 24 25 modelList = []; 26 _loadSharedPrefrences(); // ListデータをSharedPrefrencesから読込 27// ↑こういう読み込みを別classなどにまとめたい 28 } 29 30 // クリップボードにコピーするとき 31 void _copyClipboard(String text) async { 32 final data = ClipboardData(text: text); 33 await Clipboard.setData(data); 34 // print("コピーしたよ"); 35 } 36 37 // クリップボードからデータを取得するとき 38 Future<String> _getClipboard() async { 39 final data = await Clipboard.getData("text/plain"); 40 print(data.text); 41 return data.text; 42 } 43 44 String _getDateTimeNow() { 45 // 現在の時刻 46 final DateTime now = DateTime.now(); 47 return DateFormat('yyyy/MM/dd(E) HH:mm:ss').format(now); 48 } 49 50 // Listの状態をsetStateを使って更新する 51 void _updateStateList([List<Model> list]) { 52 //void _updateStateList(List<Model> list) { 53 list ??= modelList; 54 setState(() { 55 modelList = list; 56 }); 57 } 58 59 // サンプル用のデータを設定する 60 void _setSampleData() { 61 List<Model> list = []; 62 List<String> titleList = ["Title A", "Title B", "Title C"]; 63 List<String> subTitleList = ["SubTitle A", "SubTitle B", "SubTitle C"]; 64 65 for (int i = 0; i < 3; i++) { 66 Model model = Model( 67 title: titleList[i], 68 subTitle: subTitleList[i], 69 key: i.toString(), 70 ); 71 list.add(model); 72 } 73 74 _updateStateList(list); // Listの状態をsetStateを使って更新する 75 } 76 77 // 新しいデータを追加する 78 void _addListData() { 79 Model model = Model( 80 title: '', 81 subTitle: '', 82 key: modelList.length.toString(), 83 ); 84 modelList.add(model); 85 _updateStateList(modelList); // Listの状態をsetStateを使って更新する 86 //_saveSharedPrefrences(); 87 } 88 89 // ListデータをSharedPrefrencesに保存 90 Future _saveSharedPrefrences() async { 91 // Map型変換 → Json形式にエンコード → リスト化 92 List<String> list = modelList.map((f) => json.encode(f.toJson())).toList(); 93 94 SharedPreferences prefs = await SharedPreferences.getInstance(); 95 // 保存 96 await prefs.setStringList('myList', list); 97 98 print('_saveSharedPrefrences: $list'); 99 } 100 101 /// ListデータをSharedPrefrencesから読込 102 Future _loadSharedPrefrences() async { 103 SharedPreferences prefs = await SharedPreferences.getInstance(); 104 // 読込 105 var result = prefs.getStringList('myList'); 106 107 print('result:$result'); 108 109 // 読込の確認 110 if (result != null) { 111 // デコード → MapオブジェクトをModelに代入 → リストに変換 112 List<Model> list = 113 result.map((f) => Model.fromJson(json.decode(f))).toList(); 114 _updateStateList(list); // Listの状態をsetStateを使って更新する 115 } else { 116 _setSampleData(); // 必要に応じてサンプルデータで初期化 117 } 118 print('_loadSharedPrefrences'); 119 } 120 121 // 全データをSharedPreferencesから削除 122 Future _deleteAllSharedPreferences() async { 123 var preferences = await SharedPreferences.getInstance(); 124 // SharedPreferencesの値を全て削除. 125 await preferences.clear(); 126 127 List<Model> list = []; 128 _updateStateList(list); // Listの状態をsetStateを使って更新する 129 } 130} 131 132 133 class SharedPreferencesController { 134 // ListデータをSharedPrefrencesに保存 135 //Future _saveListSharedPrefrences<T>(List<T> modelList) async { 136 Future _saveListSharedPrefrences(String key, List<String> listMap) async { 137 // Map型変換 → Json形式にエンコード → リスト化 138 /// List<String> list = modelList.map((f) => json.encode(f.toJson())).toList(); 139 140 SharedPreferences prefs = await SharedPreferences.getInstance(); 141 142 // 保存 143 await prefs.setStringList(key, listMap); 144 145 print('_saveListSharedPrefrences: $listMap'); 146 } 147 148 /// ListデータをSharedPrefrencesから読込 149 Future _loadSharedPrefrences( 150 String key, Function() callbackSuccess, Function() callbackError) async { 151 SharedPreferences prefs = await SharedPreferences.getInstance(); 152 // 読込 153 var result = prefs.getStringList(key); 154 155 print('result:$result'); 156 157 // 読込の確認 158 if (result != null) { 159 // デコード → MapオブジェクトをModelに代入 → リストに変換 160 List<Model> list = 161 result.map((f) => Model.fromJson(json.decode(f))).toList(); 162 callbackSuccess(); 163 return list; 164 } else { 165 callbackError(); 166 } 167 print('_loadSharedPrefrences'); 168 } 169 170 // 全データをSharedPreferencesから削除 171 Future _deleteAllSharedPreferences(Function() callbackReload) async { 172 var preferences = await SharedPreferences.getInstance(); 173 // SharedPreferencesの値を全て削除. 174 await preferences.clear(); 175 176 callbackReload(); 177 } 178} 179 180 181class Model { 182 final String title; 183 final String subTitle; 184 final String key; 185 186 Model({ 187 this.title, 188 this.subTitle, 189 this.key, 190 }); 191 192 /// Map型に変換 193 Map toJson() => { 194 'title': title, 195 'subTitle': subTitle, 196 'key': key, 197 }; 198 199 /// JSONオブジェクトを代入 200 Model.fromJson(Map json) 201 : title = json['title'], 202 subTitle = json['subTitle'], 203 key = json['key']; 204} 205 206// 下記ソースが試した残骸 207class SharedPreferencesController { 208 // ListデータをSharedPrefrencesに保存 209 //Future _saveListSharedPrefrences<T>(List<T> modelList) async { 210 Future _saveListSharedPrefrences(String key, List<String> listMap) async { 211 // Map型変換 → Json形式にエンコード → リスト化 212 /// List<String> list = modelList.map((f) => json.encode(f.toJson())).toList(); 213 214 SharedPreferences prefs = await SharedPreferences.getInstance(); 215 216 // 保存 217 await prefs.setStringList(key, listMap); 218 219 print('_saveListSharedPrefrences: $listMap'); 220 } 221 222 /// ListデータをSharedPrefrencesから読込 223 Future _loadSharedPrefrences( 224 String key, Function() callbackSuccess, Function() callbackError) async { 225 SharedPreferences prefs = await SharedPreferences.getInstance(); 226 // 読込 227 var result = prefs.getStringList(key); 228 229 print('result:$result'); 230 231 // 読込の確認 232 if (result != null) { 233 // デコード → MapオブジェクトをModelに代入 → リストに変換 234 List<Model> list = 235 result.map((f) => Model.fromJson(json.decode(f))).toList(); 236 callbackSuccess(); 237 return list; 238 } else { 239 callbackError(); 240 } 241 print('_loadSharedPrefrences'); 242 } 243 244 // 全データをSharedPreferencesから削除 245 Future _deleteAllSharedPreferences(Function() callbackReload) async { 246 var preferences = await SharedPreferences.getInstance(); 247 // SharedPreferencesの値を全て削除. 248 await preferences.clear(); 249 250 callbackReload(); 251 } 252} 253
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/05/25 03:14