flutter - Flutter 提供程序:为什么当我更改当前页面中的数据并返回时,notifylisteners 不重建上一页的小部件?
问题描述
所以我有一个配置文件页面,其中包含编辑配置文件按钮。当我去编辑个人资料然后我成功地编辑用户名并返回个人资料页面时,用户名文本没有更新。我不知道为什么小部件没有重建,请帮忙。
我的简化代码:在个人资料页面内显示用户名的有状态小部件构建方法:
ChangeNotifierProvider(
create: (context)=>UserRepository.instance(),
child: Consumer<UserRepository>(
builder:(context,user,child)=>Text(
user.userName,
style: TextStyle(
color: Colors.white,
fontWeight: FontWeight.w500,
fontSize: 20),
textAlign: TextAlign.center,
),
),
);
内部编辑个人资料页面有状态小部件:(在顶部使用 ChangeNotifierProvider 也不起作用)
Consumer<UserRepository>(
builder: (context, user, child) => RaisedButton(
focusNode: editFocusNode,
color: Colors.blue,
child: Text(
"Update profile",
style: TextStyle(color: Colors.white),
),
onPressed: () {
_onSubmit(_username.text);
},
),
);
Future<void> _onSubmit(String userName) async {
bool isDone = await user.requestProfileUpdateAPI(
context, userName);
if (isDone) {
_key.currentState.showSnackBar(SnackBar(
content: Text("Successfully updated profile"),
));
} else {
_key.currentState.showSnackBar(SnackBar(
content: Text(user.error),
));
}
}
}
用户存储库是
enum Code { Uninitialized, Done, Progress, Error }
class UserRepository with ChangeNotifier {
Code _statusCode = Code.Uninitialized;
bool isLoggedIn = false;
String error = '';
SharedPreferences prefs;
DatabaseHelper dbHelper;
var userName;
UserRepository.instance() {
_checkIsAlreadyLogin();
dbHelper = DatabaseHelper.instance;
}
Code get statusCode => _statusCode;
void _checkIsAlreadyLogin() async {
prefs = await SharedPreferences.getInstance();
isLoggedIn = prefs.getBool('isLoggedIn') ?? false;
userName = "";
queryUserData();
notifyListeners();
}
Future<bool> requestProfileUpdateAPI(
BuildContext context, String name, String phone, String address) async {
Map<String, String> body = {
'name': name,
};
try {
_statusCode = Code.Progress;
notifyListeners();
String baseUrl = await getBaseUrl();
String token = await getToken();
final response = await http.put(
"$baseUrl$updateProfileUrl",
headers: {
'Authorization': 'Bearer $token',
},
body: body,
);
print(response.statusCode);
print(response.body.toString());
final responseJson = json.decode(response.body);
if (response.statusCode == 200) {
UserProfileModel user = new UserProfileModel.fromJson(responseJson);
if (user.success) {
print("user: $user");
_statusCode = Code.Done;
await updateCurrentLoginToDatabase(user);//user data is saved to database
queryUserData();
notifyListeners();
return true;
}
} else {
error = responseJson['message'];
}
} catch (e) {
error = e.message;
}
_statusCode = Code.Error;
notifyListeners();
return false;
}
Future<void> queryUserData() async {
List<Map<String, dynamic>> users =
await dbHelper.queryAllRows(DatabaseHelper.tableUser);
userName = users.first['name'];
notifyListeners();
}
}
在 queryUserData() 中,我从数据库中获取更新的数据,但小部件没有重建,我在这里做错了什么?任何帮助表示赞赏。
解决方案
推荐阅读
- java - 如何正确地为我的 Jcomponent 实现鼠标侦听器?
- javascript - 为什么我的 SetInterval 开始无限循环错误
- python - 可以从外部计划调用 ADF 管道吗?
- android - 带有滚动按钮的 pdf 查看器
- java - 如何在肥皂生产者中使用默认肥皂响应设置超时?
- php - 变量 php 中的 stdClass 对象值
- angularjs - angularjs在两列表格中显示来自ng-repeat的不同数据
- javascript - 如何使用字符串点表示法访问嵌套对象
- pandas - 对遵守顺序的分类索引的 pandas groupby 操作
- python - 关于 np.array 转换大小