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);
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);
); }
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。