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

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

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

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

Dart

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

Q&A

1回答

2605閲覧

Flutterのクラスについて asyncなど

momiji0210

総合スコア60

Flutter

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

Dart

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

0グッド

1クリップ

投稿2021/05/26 08:35

FlutterとDartの勉強をしているのですが、Classのうまい書き方がわかりません。

例えばSharedPreferencesに書き込んだ値を読み込みたい場合、
下記のようなFuture<bool>のような戻り値を返す方法があると思います。

この場合、

Dart

1 Future<bool> futureBool = spc.loadBool('testBool', true); 2 futureBool.then((content) => setState(() { 3 testBool = content; 4 }));

のようなコードを書くと用意した変数に代入できたのですが、
不要の変数を用意したりソースコードが長くなってしまう気がします。

Dart

1// void loadBool2(String key, bool defaultValue, bool variable) async 2// testBool = spc.loadBool('testBool', true);

のvariableに指定した変数に直接値を渡す、みたいに1行で取得する実装方法はないでしょうか。

Dart

1class SharedPreferencesController { 2 3 // Bool型を読込 4 Future<bool> loadBool(String key, bool defaultValue) async { 5 final SharedPreferences prefs = await SharedPreferences.getInstance(); 6 // キーが存在しているか 7 if (prefs.containsKey(key)) { 8 return prefs.getBool(key); 9 } else { 10 return defaultValue; 11 } 12 } 13 14 // Bool型を読込 test用 15 void loadBool2(String key, bool defaultValue, bool variable) async { 16 final SharedPreferences prefs = await SharedPreferences.getInstance(); 17 // キーが存在しているか 18 if (prefs.containsKey(key)) { 19 variable = prefs.getBool(key); 20 } else { 21 variable = defaultValue; 22 } 23 } 24} 25 26class SampleScreen extends StatefulWidget { 27 28 _SampleScreenState createState() => _SampleScreenState(); 29} 30 31class _SampleScreenState extends State<SampleScreen> { 32 SharedPreferencesController spc = new SharedPreferencesController(); 33 bool testBool; 34 35 36 // 起動時に初期化 37 void initState() { 38 super.initState(); 39 40 // Bool型を読み込み 41 Future<bool> futureBool = spc.loadBool('testBool', true); 42 futureBool.then((content) => setState(() { 43 testBool = content; 44 })); 45 46 // 引数に指定した変数に直接代入したい (参照渡し?) 47 //spc.loadBool2('testBool', true, testBool); 48 49 // 戻り値を直接Bool型にしたい Future<bool>でも1行で書きたい 50 //testBool = await spc.loadBool('testBool', true); 51 //testBool = spc.loadBool('testBool', true); 52 } 53}

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

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

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

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

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

guest

回答1

0

ないと思います!

そもそもSharedPreferencesからデータを読み込む処理は、時間がかかるので、非同期処理になっています。もしそれを同期処理として扱おうとすると呼び出し元のinitStateでは、SharedPreferencesのデータの読み込みが終わるまで処理を待たないとイケなくなり、UIの描画が停止してしまいます。
そうなっては、アプリはフリーズしたことになってしまいます。

なので、thenを使って非同期処理が終わったら状態を更新するという処理は適切だと思います。

もしくはFutureBuilderなどを使ってSharedPreferencesの読み込み中はローディングを出すみたいな方法もあります。

投稿2021/05/27 03:57

popobot

総合スコア6586

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問