iT邦幫忙

2023 iThome 鐵人賽

DAY 15
0
SideProject30

年輕人,想玩自己寫!系列 第 15

第十四章,今天就跟上里程碑吧

  • 分享至 

  • xImage
  •  

依照設定的里程碑,今天應該要完成使用者系統。
目前打算用創建遊客帳號,進入後再讓使用者綁定的方式。
所以今天要完成的,其實就只是記錄而已。
流程的說明如下:

  1. 在使用者第一次登入時,創建遊客帳號,並提示目前是遊客帳號,若刪除遊戲或換手機,資料就會不見。
  2. 使用者資料包含使用者名稱、角色、數值、稱號列表、成就列表、煉成的角色、擁有的卡牌。
  3. 再次登入時,再次提示,並有記錄之前的資料。
  4. 要有頁面可以看到使用者的資料,最好還能分享。

簡單實作遊戲記錄

其實就是想存在SharedPreferences裡就好了。

  1. 引入pub
    引入相關的pub進到專案裡:

    dependencies:
      flutter:
        sdk: flutter
      cupertino_icons: ^1.0.2
      flame: ^1.8.2
      particles_flutter: ^0.1.4
      json_annotation: ^4.8.1
      shared_preferences: ^2.2.0
    
    dev_dependencies:
      flutter_test:
        sdk: flutter
    
      build_runner: ^2.4.6
      json_serializable: ^6.7.1
    

    json_annotation是用來解析json資料的,
    在dev區塊引入的build_runner及json_serializable,
    則是能夠幫你產生gson與json之間轉換的code。
    不引入其實也是可以的,只是要轉換的話,就要自己手打。

  2. 將SharedPreferences的讀寫封裝
    在最一開始的main裡就初始化SharedPreferences,
    寫一個實作單例的類別,在裡面寫好對儲存庫的讀取、新增及修改。

    in main.dart
    Future<void> main() async {
        final SharedPreferences prefs = await SharedPreferences.getInstance();
        StaticFunction.prefs = prefs;
    }
    
    in static.dart
    
    class StaticFunction {
      /// 單例
      static final StaticFunction self = StaticFunction();
    
      ///共用
      static late SharedPreferences prefs;
    
    
      static StaticFunction getInstance() {
        return self;
      }
    
      Future<void> createAccount () async {
    
      }
    
      UserData? getAccount ()  {
    
        return <UserData>;
      }
    
      Future<UserData?> editAccount (UserData userData)  async {
        /// input
        await prefs.setString("user_data",userData.toJson().toString());
    
        /// output to check again
        String? dataString = prefs.getString("user_data");
        UserData userDataNew = UserData.fromJson(jsonDecode(dataString!));
        return userDataNew;
      }
    }
    
    
  3. 建立相關的model
    建立model資料夾,以及UserData、CardModel、CharacterModel。
    標記上@JsonSerializable(),完成後執行 dart run build_runner build。
    最後就會幫你創一個<類別名稱>.g.dart的檔案,裡面有自動產生的轉換方法。
    像是這樣:

    import 'package:json_annotation/json_annotation.dart';
    
    part 'user_data.g.dart';
    
    @JsonSerializable()
    class UserData {
      String id;
      String name;
      ...
    
      UserData(this.id, this.name...);
    
      // 這個facotry是必須要有的,為了從map創建一個新的UserData實例
      // 把整個map傳遞`_$UserDataFromJson()`
      factory UserData.fromJson(Map<String, dynamic> json) => _$UserDataFromJson(json);
    
      // `toJson`是用來限制即將進行序列化到JSON
      Map<String, dynamic> toJson() => _$UserDataToJson(this);
    }
    
  4. 串接UI
    一開始有提到要有AlertDialog的提示,而且要和進入遊戲的流程串起來。
    裡面的功能有需要修改使用者記錄的,也要加入修改資料庫的部份。

  5. 展示記錄
    建立一個新的頁面,用來顯示使用者資料的。

  6. 今日結果
    https://i.imgur.com/N7gN1Sa.gif


上一篇
第十三章,試著找回信心
下一篇
第十五章,再進一小步,應該不難吧?
系列文
年輕人,想玩自己寫!31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言