iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 30
1
Mobile Development

新手試試用Flutter做Netflix UI系列 第 30

[Day30]Flutter Netflix UI 使用shared_preferences

  • 分享至 

  • xImage
  •  

大家好,今天是最後一天,今天跟大家介紹shared_preferences,可以把一些簡單的設定的東西存在裡面

在pubspec.yaml新增shared_preferences: ^0.5.12+2

dependencies:
  shared_preferences: ^0.5.12+2

import,我是用在SelectUserPage這一頁中

import 'package:shared_preferences/shared_preferences.dart';

每次使用SharedPreferences都是使用SharedPreferences.getInstance()

  Future<SharedPreferences> _prefs = SharedPreferences.getInstance();
  Future<List<User>> _users;

存入資料

 Future<void> mockNetworkData() async {
    print('future work');
    return Future.delayed(Duration(seconds: 4), () async {
      final SharedPreferences prefs = await _prefs;
      //假設雲端傳來的資料轉化後的List是這樣4位
      List<User> users = [
        User("Player1", "assets/icons/icon_user.jpg"),
        User("Player2", "assets/icons/icon_user.jpg"),
        User("Player3", "assets/icons/icon_user.jpg"),
        User("Player4", "assets/icons/icon_user.jpg"),
      ];
      //直接把整個List變成json
      String s = json.encode(users);

      setState(() {
      //存入資料使用setString(key,value)然後回傳users
        _users = prefs.setString('users', s).then((bool success) {
          return users;
        });
      });
    });
  }
 @override
  void initState() {
    _users = _prefs.then((SharedPreferences prefs) {
    //取出字串資料使用getString
      String _string = prefs.getString('users') ?? '';
      List list = json.decode(_string);
      //取出的時候並非直接是User的資料格式,所以這邊針對list裡面每個item轉化成User
      List<User> users = list.map((e) => User.fromJson(e)).toList();
      return users;
    });
    super.initState();
  }

在FutureBuilder中使用,future為_users

 FutureBuilder<List<User>>(
                  future: _users,
                  builder: (context, snapshot) {
                    print("snapshot: $snapshot");
                    if (snapshot.connectionState == ConnectionState.done) {
                      return GridView.count(
                        shrinkWrap: true,
                        crossAxisCount: 2,
                        crossAxisSpacing: 16.0,
                        mainAxisSpacing: 16.0,
                        childAspectRatio: 10 / 12,
                        children: List.generate(snapshot.data.length,
                            (index) => _buildUser(snapshot.data[index])),
                      );
                    }
                    return GridView.count(
                      shrinkWrap: true,
                      crossAxisCount: 2,
                      crossAxisSpacing: 16.0,
                      mainAxisSpacing: 16.0,
                      childAspectRatio: 10 / 12,
                      children: List.generate(4, (index) => _buildWaiting()),
                    );
                  }),

終於完成30天的挑戰,這30天比較像是我的學習筆記,對我自己來說,這30天幫助我釐清很多觀念,畢竟為了做出這個clone,很多地方都要再看一次資料。前半的篇章還算可以,後半開始發現很多地方不是很熟,也激勵自己去補足自己不會的東西,希望這些學習經驗也可以幫助到別人,歡迎大家多多指教,感謝!

最近Flutter更新到3.0版本了,我也更新了這隻程式。這段時間陸續有看到有人追蹤這個系列文章,真的很感謝大家。我在每篇文章都附上source code連結有興趣的朋友可以看看。
GitHub連結: flutter-netflix-clone


上一篇
[Day29]Flutter Netflix UI 底部導航欄上的通知數量
系列文
新手試試用Flutter做Netflix UI30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言