What's the best programming practice to
create a constant class in Flutter
to keep all the application constants for easy reference. I know that there is const
keyword in Dart for creating constant fields, but is it okay to use static
along with const, or will it create memory issues during run-time.
class Constants {
static const String SUCCESS_MESSAGE=" You will be contacted by us very soon.";
}
While there are no technical issues with static const
, architecturally you may want to do it differently.
Flutter tend to not have any global/static variables and use an InheritedWidget.
Which means you can write:
class MyConstants extends InheritedWidget {
static MyConstants of(BuildContext context) => context. dependOnInheritedWidgetOfExactType<MyConstants>();
const MyConstants({Widget child, Key key}): super(key: key, child: child);
final String successMessage = 'Some message';
@override
bool updateShouldNotify(MyConstants oldWidget) => false;
}
Then inserted at the root of your app:
void main() {
runApp(
MyConstants(
child: MyApp(),
),
);
}
And used as such:
@override
Widget build(BuilContext context) {
return Text(MyConstants.of(context).successMessage);
}
This has a bit more code than the static const
, but offer many advantages:
- Works with hot-reload
- Easily testable and mockable
- Can be replaced with something more dynamic than constants without rewriting the whole app.
But at the same time it:
- Doesn't consume much more memory (the inherited widget is typically created once)
- Is performant (Obtaining an InheritedWidget is O(1))
My preferred solution is to make my own Dart library.
Make a new dart file named constants.dart
, and add the following code:
library constants;
const String SUCCESS_MESSAGE=" You will be contacted by us very soon.";
Then add the following import statement to the top of any dart file which needs access to the constants:
import 'constants.dart' as Constants;
You may need to run flutter pub get
for the file to be recognized.
And now you can easily access your constants with this syntax:
String a = Constants.SUCCESS_MESSAGE;
That's completely up to you.
Using static has no disadvantages.
Actually const
is required for fields in a class.