Во Flutter часто используются модальные окна для отображения дополнительной информации или записи пользовательского ввода. Однако после закрытия модального окна вы можете обновить или обновить основной экран. В этой статье мы рассмотрим несколько простых и понятных способов добиться этого, сопровождая их примерами кода.
Метод 1: использование управления состоянием (поставщик)
Одним из популярных подходов является использование решения для управления состоянием, такого как Provider. Начните с создания класса поставщика для хранения состояния экрана. Когда модальное окно закрыто, обновите состояние с помощью метода notifyListeners
, который запускает перестройку экрана. Вот пример:
class ScreenProvider extends ChangeNotifier {
bool shouldRefreshScreen = false;
void closeModal() {
// Perform necessary actions when the modal is closed
shouldRefreshScreen = true;
notifyListeners();
}
}
Метод 2: функция обратного вызова
Еще один простой метод — передать функцию обратного вызова с экрана в модальное окно. Когда модальное окно закрыто, вызовите функцию обратного вызова, чтобы вызвать обновление экрана. Вот пример:
class MyScreen extends StatelessWidget {
void closeModal() {
// Perform necessary actions when the modal is closed
// ...
}
void refreshScreen() {
// Refresh the screen here
// ...
}
void openModal() {
showModal(
// ...
onClose: () => closeModal(),
onRefresh: () => refreshScreen(),
);
}
// ...
}
Метод 3: Navigator.pop с результатом
При переходе обратно с модального экрана вы можете передать результат на предыдущий экран. Используйте этот результат, чтобы вызвать обновление экрана. Вот пример:
class MyScreen extends StatelessWidget {
void openModal() async {
final result = await Navigator.push(
context,
MaterialPageRoute(builder: (context) => ModalScreen()),
);
if (result == 'refresh') {
// Refresh the screen here
// ...
}
}
// ...
}
Метод 4: InheritedWidget
InheritedWidget можно использовать для распространения изменений из модального окна на базовый экран. Когда модальное окно закрыто, обновите значение InheritedWidget, что приведет к перестройке экрана. Вот пример:
class ScreenUpdater extends InheritedWidget {
final VoidCallback closeModal;
ScreenUpdater({
Key key,
@required Widget child,
@required this.closeModal,
}) : super(key: key, child: child);
static ScreenUpdater of(BuildContext context) {
return context.dependOnInheritedWidgetOfExactType<ScreenUpdater>();
}
@override
bool updateShouldNotify(ScreenUpdater oldWidget) => true;
}
class MyScreen extends StatelessWidget {
void closeModal(BuildContext context) {
// Perform necessary actions when the modal is closed
// ...
ScreenUpdater.of(context).closeModal();
}
// ...
}
В этой статье мы рассмотрели несколько способов обновления экрана после закрытия модального окна во Flutter. Используя управление состоянием, функции обратного вызова, Navigator.pop с результатом или InheritedWidget, вы можете легко добиться желаемого обновления экрана. Выберите метод, который лучше всего соответствует архитектуре и требованиям вашего приложения, и наслаждайтесь удобством использования.