1. Remove unnecessary super.key
    1. Old Constructor was const Waterlog({super.key});
    2. The new constructor becomes const Waterlog({Key? key})
    3. In Dart, the use of super.key is unnecessary when you don't have a superclass constructor that requires a key. The Waterlog class is not extending any other class that has a constructor with a key parameter.
  2. Follow flutter naming conventions
    1. Flutter follows camelCase convention
// Good naming convention
class MyClass {}

// Bad naming convention
class my_class {}

// example of naming convention in my code
class Waterlog extends StatelessWidget
  1. Use of descriptive variable and function names
// Good variable name
final String fullName = 'John Doe';

// Bad variable name
final String name = 'John Doe';

// Example of variable names and function names in my code
String? requiredWaterIntake;
void updateRequiredWaterIntake(String? intake) {}
  1. Single Responsibility Principle
    1. Each class or function should have a single responsibility and should not be responsible for multiple tasks
// Examples of functions and getters in my code
void updateRequiredWaterIntake(String? intake) {
    requiredWaterIntake = intake;
    if(kDebugMode) {
      print("Updated Water Intake");
    }
    notifyListeners();
  }

  String? get waterIntake => requiredWaterIntake;
  1. Using const for values that will not change
    1. For example, providing padding to a widget where the value is a hardcoded number.
    2. Since the number is not going to change over time or by any user actions or by pre-programmed actions, we use const for values that are known at compile time to enhance performance and ensure immutability.
padding: const EdgeInsets.symmetric(horizontal: 50.0),