kcwu229 / Mobile-App-BlackJack-Game

2 stars 0 forks source link

levelUp after receiving exp Award #50

Open kcwu229 opened 1 month ago

kcwu229 commented 1 month ago

import 'package:shared_preferences/shared_preferences.dart';

Widget showUserExp(slideOne, function, width, expAward) { // Add a state variable to keep track of the user's level and experience final ValueNotifier<Map<String, dynamic>> _userData = ValueNotifier<Map<String, dynamic>>({});

UserExp userExpClass = UserExp();

// Load the user's level and experience from SharedPreferences _loadUserData(_userData);

return ValueListenableBuilder<Map<String, dynamic>>( valueListenable: userData, builder: (context, userData, ) { if (userData.isNotEmpty) { final userLevel = userData['level']; final userExp = userData['exp']; final totalExp = UserExp().getExp(userLevel);

    userExpClass.levelUp(userLevel, userExp, expAward);

    return Padding(
      padding: EdgeInsets.all(10),
      child: Column(children: [
        // ... (existing code)
        levelBar(userLevel, userExp, totalExp, expAward),
        // ... (existing code)
      ]),
    );
  } else {
    return CircularProgressIndicator(); // or some other loading indicator
  }
},

); }

Future _loadUserData(ValueNotifier<Map<String, dynamic>> userData) async { final prefs = await SharedPreferences.getInstance(); final level = prefs.getInt('level') ?? 0; final exp = prefs.getInt('exp') ?? 0;

userData.value = { 'level': level, 'exp': exp, }; }

这段代码的主要变化有以下几点:

_userData 这个状态变量现在被初始化为一个空的 map {}。之前它被初始化为一个包含 'level' 和 'exp' 键的 map,值都是 0。 增加了一个名为 _loadUserData 的函数,它的作用是从 SharedPreferences 加载用户的等级和经验值,并更新 _userData 变量的值。 使用了 ValueListenableBuilder 来监听 _userData 变量的变化,并在变化时重新构建 UI。 这样做的好处是:

在页面第一次加载时,先显示一个加载指示器,等待从 SharedPreferences 中读取用户数据。 当数据读取完成后,页面会根据实际的等级和经验值渲染正确的内容。 如果 SharedPreferences 中没有保存任何数据,默认会使用 'level' 和 'exp' 键对应的初始值 0。 总的来说,这个改动可以确保页面能够正确地显示用户的等级和经验值,而不是之前硬编码的 0。