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

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

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

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

Dart

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

Q&A

解決済

2回答

1254閲覧

【Flutter】 Sharedpreferencesの値がnullの場合の分岐が、分岐しない

my0930

総合スコア19

Flutter

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

Dart

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

0グッド

0クリップ

投稿2022/09/26 06:39

編集2022/09/26 06:42

前提

Sharedpreferencesを使って値が保存されているかどうかの分岐を作りましたが、
nullの値が返ってくるのにもかかわらず、
null分岐のほうに流れてくれません。

nullじゃなかったらnullじゃない場合の変数を用いてfirebaseから値を持ってきたいのですが
nullなのにnullじゃないほうに流れてエラーになります。

実現したいこと

nullの場合は、if(sharedprefs == null)以下に、
nullじゃない場合はif(sharedprefs != null)以下に流れてほしい。

発生している問題・エラーメッセージ

例外が発生しました
StateError (Bad state: cannot get a field on a DocumentSnapshotPlatform which does not exist)

該当のソースコード

SharedPrefs

1class SharedPrefs { 2 static SharedPreferences? _preferences; 3 4 static Future<void> setPrefsInstance() async { 5 //インスタンス生成 6 _preferences ??= await SharedPreferences.getInstance(); 7 } 8 9 //端末に書き込む 10 static Future<void> setUid(String uid) async { 11 await _preferences!.setString("uid", uid); 12 } 13 14 //読み込む 15 static fetchUid() { 16 return _preferences!.getString("uid") ?? null; 17 } 18 19 static revomeUid() { 20 return _preferences?.remove("uid"); 21 } 22} 23

provider.model

1class Provider extends ChangeNotifier { 2Future checkRole() async { 3 4 String? role; 5 6 final SharedUid = SharedPrefs.fetchUid(); 7 8 print("firebaseのuidは"); 9 print(uid); 10 print(uid.runtimeType); 11 12 print("shredprefeceのuidは"); 13 print(SharedUid); 14 print(SharedUid.runtimeType); 15 16 if (SharedUid != null || SharedUid != "" || SharedUid != "null") { 17 final DocumentSnapshot? sharedprefdocumentSnapshot = 18 await FirebaseFirestore.instance 19 .collection("users") 20 .doc(SharedUid) 21 .get(); 22 23 print("このユーザーのfirebaseの値のroleは"); 24 print(role); 25 26 role = sharedprefdocumentSnapshot?["role"]; 27 //ここでビルドが止まり、記載のエラー文が出ます。 28 29 30 } else if (SharedUid == null || 31     SharedUid == "" || 32     SharedUid == null.toString()) { 33 34 print("uidはセットしました"); 35 SharedPrefs.setUid(uid.toString()); 36 print(uid); 37 38 } 39 } 40} 41

試したこと

if分岐の際、型がStringなのでnullと読み込まない原因かと考えて、変換しましたが
しっかり分岐してくれません。

補足情報(FW/ツールのバージョンなど)

Flutter 3.0.5

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

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

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

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

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

guest

回答2

0

Shared_Preferencesに実際に入っているものを確認してみると余計なものが入っており、
それがnullチェックに影響が出たと思われます。
余計なものを削除(デモアプリごと削除するか、xmlファイルの<map>の中の該当の値を消す)すると、
nullチェックが正常に動きました。

投稿2022/09/27 02:51

my0930

総合スコア19

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

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

0

ベストアンサー

void main() { String? str1; print(str1 != null);//false print(str1 != ''); //true }

Dartでは上記サンプルコードの最後の行はtrueになります。
ですのでSharedUidがnullの時、下記のifブロックの条件式はtrueと評価されるので、下記のifブロック内は実行されます。

if (SharedUid != null || SharedUid != "" || SharedUid != "null") { ... } else if( ... ){

ですのでこれを考慮してコントロールフローのコードを書くとうまくいくと思います。

投稿2022/09/26 11:40

moriman

総合スコア615

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

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

my0930

2022/09/27 02:47

nullの扱いに関して調べるきっかけとなりました。 ありがとうございました! 実際には開発途中で違う名前の違う値で、SharedPreferencesに保存されていたからのようです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問