Итак, у меня есть страница профиля, на которой есть кнопка редактирования профиля. Когда я go редактирую профиль, а затем я успешно редактирую имя пользователя и go возвращаюсь на страницу профиля, текст имени пользователя не обновляется. Я не могу понять, почему виджет не перестраивается, пожалуйста, помогите.
Мой пример кода: внутри страницы профиля Метод построения виджета с сохранением состояния, который показывает имя пользователя:
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 () я получаю обновленные данные из базы данных, но виджет не восстановление, я делаю что-то не так здесь? Любая помощь приветствуется.