Na minha página de configurações, tenho a possibilidade de o usuário alterar o tema do aplicativo em tempo de execução, mas estou tendo alguns problemas.
O problema é que estou usando preferências compartilhadas com o Riverpod para armazenar as alterações feitas na minha página de configurações e sempre que altero o tema, meu seletor de diálogo e a tela de configurações fecham e me levam de volta à tela inicial.
Não quero que isso aconteça. Quero que o usuário permaneça na página de configurações e veja as alterações na própria página de configurações, em vez de redefinir para a rota padrão.
Criei aplicativos usando Android nativo e Kotlin, e esse era o comportamento normal lá.
Você pode me ajudar a conseguir o mesmo aqui?
Abaixo está meu código:
class MesMaterialApp extends ConsumerWidget {
MesMaterialApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
// Retrieve the router
final router = MesAppRouter.getRouter(
initialLocation: ref.watch(settingsProvider.select((s) => s.isOnboarded))
? HomeRoute.path
: WelcomeRoute.path,
);
// Determine the app brightness (theme)
final brightness = View.of(context).platformDispatcher.platformBrightness;
// Create the text theme
TextTheme textTheme = createTextTheme(context, "Poppins", "Lato");
// Create the app bar theme
AppBarTheme appBarTheme = createAppBarTheme(
brightness == Brightness.light,
);
// Create the material theme
MaterialTheme theme = MaterialTheme(
textTheme,
appBarTheme,
);
// Return the Material App
return MaterialApp.router(
debugShowCheckedModeBanner: false,
// debugShowMaterialGrid: true,
title: 'Flutter Demo',
theme: theme.light(),
darkTheme: theme.dark(),
themeMode: ref.watch(settingsProvider.select(
(s) => s.theme,
)),
highContrastTheme: theme.lightHighContrast(),
highContrastDarkTheme: theme.darkHighContrast(),
localizationsDelegates: AppLocalizations.localizationsDelegates,
supportedLocales: AppLocalizations.supportedLocales,
routerConfig: router,
);
}
}
Abaixo está o código do meu roteador:
class MesAppRouter {
static GoRouter getRouter({String initialLocation = HomeRoute.path}) {
return GoRouter(
initialLocation: initialLocation,
routes: <RouteBase>[
GoRoute(
name: WelcomeRoute.name,
path: WelcomeRoute.path,
builder: (BuildContext context, GoRouterState state) {
return const WelcomeScreen();
},
),
GoRoute(
name: HomeRoute.name,
path: HomeRoute.path,
pageBuilder: (BuildContext context, GoRouterState state) {
return CustomTransitionPage(
key: state.pageKey,
child: HomeScreen(),
transitionsBuilder:
(context, animation, secondaryAnimation, child) {
return ScaleTransition(
scale: Tween<double>(
begin: 0.95,
end: 1.0,
).animate(animation),
child: child,
);
},
);
},
),
GoRoute(
name: ServicesRoute.name,
path: ServicesRoute.path,
pageBuilder: (BuildContext context, GoRouterState state) {
final String query;
if (state.extra != null) {
final data = state.extra as Map<String, dynamic>;
query = data[ServicesRoute.extraQuery];
// Use data safely here
} else {
query = "";
// Handle case where extra is null
}
return CustomTransitionPage(
key: state.pageKey,
child: ServicesScreen(
searchQuery: query,
),
transitionsBuilder:
(context, animation, secondaryAnimation, child) {
return ScaleTransition(
scale: Tween<double>(
begin: 0.95,
end: 1.0,
).animate(animation),
child: child,
);
},
);
},
),
GoRoute(
name: CycloneReportRoute.name,
path: CycloneReportRoute.path,
pageBuilder: (BuildContext context, GoRouterState state) {
return CustomTransitionPage(
key: state.pageKey,
child: CycloneScreen(),
transitionsBuilder:
(context, animation, secondaryAnimation, child) {
return ScaleTransition(
scale: Tween<double>(
begin: 0.95,
end: 1.0,
).animate(animation),
child: child,
);
},
);
},
),
GoRoute(
name: PrecallRoute.name,
path: PrecallRoute.path,
builder: (BuildContext context, GoRouterState state) {
final data = state.extra! as Map<String, dynamic>;
return PreCallScreen(
service: data[PrecallRoute.extraService],
number: data[PrecallRoute.extraNumber].toString(),
onComplete: () => context.goBack(),
);
},
),
GoRoute(
name: AboutRoute.name,
path: AboutRoute.path,
builder: (BuildContext context, GoRouterState state) {
return const AboutScreen();
},
),
GoRoute(
name: SettingsRoute.name,
path: SettingsRoute.path,
builder: (BuildContext context, GoRouterState state) {
return const SettingsScreen();
},
),
],
);
}
}