Don't copyWith a ThemeData in Flutter
While reading the code of flutter apps, I’ve seen this particular piece of code repeated way too many times:
return MaterialApp(
theme: ThemeData.dark().copyWith(
textTheme: ...
),
home: ...
)
This is problematic for a couple reasons that become clear when we take a peek at how ThemeData works.
This is taken directly from the material
library’s code:
factory ThemeData.dark() => ThemeData(brightness: Brightness.dark);
That is all that it does. It just changes the brightness
parameter from light to dark. What does the source code for copyWith
look like? Well, you can take a look for yourself.
All this class-constructing parameter-passing is unnecessary work that could be easily avoided.
There’s another problem with this approach too. The default ThemeData
constructor provides useful information on some of the parameters, but copyWith
replaces it with less helpful documentation.
How to use ThemeData correctly #
return MaterialApp(
theme: ThemeData(
brightness: Brightness.dark,
textTheme: ...
),
home: ...
)
Instead of copying ThemeData.dark()
, we’re just providing a brightness to the default factory. The correct values will be calculated from the brightness just like before. One disadvantage with this method is that it might be less readable. For this reason, you should always put the brightness
first, before the other arguments.