Поставщик флаттера: почему notifylisteners не перестраивает виджет предыдущей страницы, когда я изменяю данные на текущей странице и go назад? - PullRequest
0 голосов
/ 15 февраля 2020

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

...