【Flutter】SharedPreferencesで端末にデータを保存する

# はじめに
アカウント作成時にSharedPreferencesを使って端末にデータを保存する方法をまとめます。
（※[こちら](https://qiita.com/rinka00851830/items/3a3ebb5bf48474fd81ab)の続きになります）

# 作成したもの
## 完成形のコード
shared_preferencesを活用したコード

```dart:shared_prefs.dart
import 'package:shared_preferences/shared_preferences.dart';

class SharedPrefs {
  static SharedPreferences? prefs;

  static Future<void> setInstance() async {
    prefs ??= await SharedPreferences.getInstance();
  }

  static Future<void> setUid(String newUid) async {
    await prefs!.setString('uid', newUid);
    print("端末にUid保存完了");
  }
}
```

cloud_firestoreを活用したコード

```dart:firebase.dart
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:twitter/utils/shared_prefs.dart';

class Firestore {
  static FirebaseFirestore firestoreInstance = FirebaseFirestore.instance;

  static CollectionReference users = firestoreInstance.collection('users');

  static Future<bool> existsUserName(userName) async{
    bool temp = false;
    await users
        .doc(userName)
        .get()
        .then((DocumentSnapshot documentSnapshot) {
          if (documentSnapshot.exists) {
            temp = true;
          }
        });

    return temp;
  }

  static Future<void> signUp(name, userName) async {
    await users
        .doc(userName)
        .set({
          'name': name,
          'createdAt': Timestamp.now()
        })
        .then((value) => print("signUp"))
        .catchError((error) => print("Failed to singUp: $error"));

    await SharedPrefs.setUid(userName);
  }
}
```

ボタンを押したら新規作成の処理をし、HomePage()に遷移させるコード

```dart
ElevatedButton(
    onPressed: () async{
        if(_formKey.currentState!.validate()){
            if(!_existsUserName) {
                await Firestore.signUp(_nameController.text, _userNameController.text);
                Navigator.pushReplacement(context, MaterialPageRoute(builder: (_) => const HomePage()));
            }
        }
    },
    child: const Text('新規作成'),
),
```

main.dartの一部コード

```dart:main.dart
void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  await SharedPrefs.setInstance();
  runApp(const MyApp());
}
```

### shared_preferences
インスタンスを取得した後でデータを保存する処理が出来る。

```dart
  static SharedPreferences? prefs;

  static Future<void> setInstance() async {
    // インスタンスを取得
    // main.dartで活用
    prefs ??= await SharedPreferences.getInstance();
  }

  static Future<void> setUid(String newUid) async {
    // String型のデータを端末に保存
    // firebase.dartのsignUpで活用
    await prefs!.setString('uid', newUid);
    print("端末にUid保存完了");
  }
```

以下に詳しく載っているので良かったらぜひ。

https://docs.flutter.dev/cookbook/persistence/key-value

### cloud_firestore

以下でUsernameをUidとして端末に保存する。

```dart:firebase.dart
  static Future<void> signUp(name, userName) async {
    await users
        .doc(userName)
        .set({
          'name': name,
          'createdAt': Timestamp.now()
        })
        .then((value) => print("signUp"))
        .catchError((error) => print("Failed to singUp: $error"));

    // usernameを端末にUidとして保存する
    await SharedPrefs.setUid(userName);
  }
```


# 参考資料
https://pub.dev/packages/shared_preferences

https://docs.flutter.dev/cookbook/persistence/key-value

# おわりに

ここまで読んでいただき、ありがとうございました。
何かありましたらコメントをお願いします。