Смена темы с помощью GetX
Я хочу сменить тему на
redTheme
только когда я на определенном маршруте. Для этого я использовал
routingCallback
нравиться
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return GetMaterialApp(
title: 'App',
theme: defaultTheme(context),
initialRoute: AppPages.INITIAL,
getPages: AppPages.routes,
routingCallback: (routing) => _routingCallback(context, routing),
);
}
_routingCallback(BuildContext context, Routing routing) {
if (routing.current == Routes.PURSUE_MODE) {
_changeThemeIfNeeded(redTheme(context));
} else {
_changeThemeIfNeeded(defaultTheme(context));
}
}
void _changeThemeIfNeeded(ThemeData theme) {
Get.changeTheme(theme);
}
}
К сожалению, это вызывает
════════ Исключение, обнаруженное библиотекой виджетов ══════════════════════════════════════════════════════ setState() или markNeedsBuild() вызывается во время сборки. Соответствующий виджет, вызывающий ошибку: Файл направленности:///Users/jakub/.pub-cache/hosted/pub.dartlang.org/get_navigation-3.12.0/lib/src/root/root_widget.dart:235:22 ══════════════════════════════════════════════════════════════════════════════════════════════════
Из-за этого я обернул изменение темы в блоке try-catch, поэтому я не получаю исключения в начале
void _changeThemeIfNeeded(ThemeData theme) {
try {
if (Get.theme != theme) {
Get.changeTheme(theme);
}
} catch (e) {
print('Not ready e = $e');
}
}
Но я считаю, что есть более элегантный подход к этой проблеме, используя
Get
фреймворк?
1 ответ
Я не очень знаком с GetX. Однако во избежание
setState() or markNeedsBuild() called during build.
ошибку, вы можете использовать addPostFrameCallback в вашем случае, например:
routingCallback: (routing) => WidgetsBinding.instance
.addPostFrameCallback((_) => _routingCallback(context, routing))