Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
void main() {
runApp(_SwitchingThemeApp());
}
/// Properties that help me keep track of the example being run.
bool _useMaterial = false;
class _SwitchingThemeApp extends StatefulWidget {
@override
_SwitchingThemeAppState createState() => _SwitchingThemeAppState();
static Future<bool> updateTheme(
final BuildContext context,
final ThemeMode themeMode,
) async {
final state = context.ancestorStateOfType(
const TypeMatcher<_SwitchingThemeAppState>(),
) as _SwitchingThemeAppState;
if (state?.mounted == true) {
state.updateTheme(themeMode);
return true;
}
return false;
}
}
class _SwitchingThemeAppState extends State<_SwitchingThemeApp> {
ThemeMode _themeMode = ThemeMode.system;
final ThemeData _light = ThemeData.from(colorScheme: ColorScheme.light());
final ThemeData _dark = ThemeData.from(colorScheme: ColorScheme.dark());
void updateTheme(ThemeMode mode) {
setState(() {
_themeMode = mode;
});
}
@override
Widget build(BuildContext context) {
if (_useMaterial) {
return MaterialApp(
home: _DummyPage(),
themeMode: _themeMode,
theme: _light,
darkTheme: _dark,
);
} else {
final platformBrightness = MediaQuery.platformBrightnessOf(context);
ThemeData currentTheme;
if (_themeMode == ThemeMode.system) {
currentTheme = platformBrightness == Brightness.light ? _light : _dark;
} else {
currentTheme = _themeMode == ThemeMode.light ? _light : _dark;
}
return CupertinoApp(
home: _DummyPage(),
theme: MaterialBasedCupertinoThemeData(materialTheme: currentTheme),
);
}
}
}
class _DummyPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
/// Required only because we don't if the example
/// is being run using material widget or cupertino widget.
final messageStyle = _useMaterial
? Theme.of(context).textTheme.headline
: CupertinoTheme.of(context).textTheme.navLargeTitleTextStyle;
final background = _useMaterial
? Theme.of(context).scaffoldBackgroundColor
: CupertinoTheme.of(context).scaffoldBackgroundColor;
final brightness = _useMaterial
? Theme.of(context).brightness
: CupertinoTheme.of(context).brightness;
return SafeArea(
child: Container(
color: background,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
"My color will change depending on the theme",
style: messageStyle,
textAlign: TextAlign.center,
),
Switch.adaptive(
value: brightness == Brightness.dark,
onChanged: (enable) {
_SwitchingThemeApp.updateTheme(
context,
enable ? ThemeMode.dark : ThemeMode.light,
);
},
)
],
),
),
);
}
}
@fredgrott

This comment has been minimized.

Copy link

@fredgrott fredgrott commented Dec 1, 2019

Nice! Now I can combine that with flutter_platform_widegts and save some time..good job!

@bitsydarel

This comment has been minimized.

Copy link
Owner Author

@bitsydarel bitsydarel commented Dec 1, 2019

Glad I could help @fredgrott

@vargavince91

This comment has been minimized.

Copy link

@vargavince91 vargavince91 commented Dec 2, 2019

If you renamed the gist to something.dart, there would be syntax highlighting (I just forked your code, here is what I meant https://gist.github.com/vargavince91/912f9ae7cac6b74293aac8f41f177ff7)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.