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

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

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

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

Dart

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

Q&A

解決済

1回答

1138閲覧

Flutterで独自関数を実装する

momiji0210

総合スコア60

Flutter

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

Dart

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

0グッド

0クリップ

投稿2021/05/24 13:40

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

Dart では _ で始まる関数などは private という扱いになるのでクラスの外からはアクセスできません。
https://dart.dev/guides/language/language-tour#libraries-and-visibility

投稿2021/05/24 15:42

mather

総合スコア6759

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

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

momiji0210

2021/05/25 03:14

アドバイスありがうございます! そうだったのですね・・・。知らなかったです。 publicとかその変どう書くのか把握してなかったのでその情報ありがたいです。 だから_つけてる関数多かったのですね。 情報ありがうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問