Estou tentando criar um tema escuro com base em um tema claro existente usando lightTheme.copyWith(brightness: Brightness.dark)
. No entanto, o aplicativo parece ignorar o brilho do tema escuro.
Meu main.dart usa o seguinte código:
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: Themes.lightTheme,
darkTheme: Themes.darkTheme,
themeMode: ThemeMode.dark,
...
);
}
onde Themes.lightTheme
e Themes.darkTheme
são definidos da seguinte forma:
class Themes {
static ThemeData get lightTheme => ThemeData(
colorSchemeSeed: Colors.green,
);
static ThemeData get darkTheme => lightTheme.copyWith(
brightness: Brightness.dark,
);
}
O depurador mostra que o tema escuro contém brightness: Brightness.dark
.
Entretanto, tudo funciona bem quando defino o tema escuro da seguinte forma, sem copyWith
:
class Themes {
static ThemeData get lightTheme => ThemeData(
colorSchemeSeed: Colors.green,
);
static ThemeData get darkTheme => ThemeData(
colorSchemeSeed: Colors.green,
brightness: Brightness.dark,
);
}
Alguém poderia me apontar meu ponto cego de conhecimento sobre Dart/Flutter e explicar o que acontece?
Ambiente:
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, 3.29.3, on Microsoft Windows [Version 10.0.22631.5262], locale xx-XX)
[✓] Windows Version (11 Home 64-bit, 23H2, 2009)
[✓] Android toolchain - develop for Android devices (Android SDK version 35.0.1)
[✓] Chrome - develop for the web
[✓] Visual Studio - develop Windows apps (Visual Studio Community 2022 17.13.6)
[✓] Android Studio (version 2024.3)
[✓] VS Code (version 1.99.3)
[✓] Connected device (3 available)
[✓] Network resources
Isso
ThemeData.copyWith
só altera abrightness
propriedade em si (ou melhor,ColorScheme
dentro dela). E o brilho em si afeta apenas coisas como, por exemplo, a cor do texto na barra de status do iOS.O
ThemeData
construtor, por outro lado, faz muito mais . Dado ocolorSchemeSeed
ebrightness
ele cria um esquema de cores completo para você:O problema aqui é que simplesmente usar
lightTheme.copyWith(brightness: Brightness.dark)
não converte completamente o tema em um tema escuro adequado.Embora
brightness:Brightness.dark
atualize o campo de brilho, ele não atualiza corretamente as outras propriedades do tema, como cores de fundo, cores de texto e estilo padrão, que vêm com um tema verdadeiramente escuro. Essas propriedades são geradas internamente pelo Flutter quando você cria explicitamente um tema combrightness: Brightness.dark.
Solução:
Defina seu tema escuro separadamente usando
ThemeData
withbrightness: Brightness.dark
, como você fez aqui:Isso garante que todas as propriedades relacionadas ao tema sejam alinhadas corretamente para um tema escuro.