Starting with Flutter: Sound nullsafety
Tags: flutter, dart, beginners, webdev
Published: 2021-10-13 15:19:05

Flutter 2 has landed few months ago and one of the key feature of the release were **Null Safety.**

Null safety it's an huge upgrade, to start migrating, inside the `pubspec.yaml` file, change the sdk minimum to **2.12.0:**

```java
environment:
  sdk: ">=2.12.0<3.0.0" 
```

then in the terminal run the following commands to regenerate the package configuration file:

- `flutter clean`
- `flutter pub get`

Now you'll have pretty much all the code broken, don't worry (or maybe yes :)), it's normal. Let's see now how your world will change:

 

### Dependencies

You can still use non-null safety dependencies in your project but you should absolutely consider to update them as soon as possible. If a dependency needs dart **SDK < 2.12** it will be not usable anymore. To check on updates and which package needs to do implement **null safety** you can use this command:

```javascript
dart pub outdated --mode=null-safety
```

You will see if your packages are null safety ready or if they need some updates.

 

### "required"

You are already accustomed to the `@required` keyword which will create a warning if a parameter is missing from a constructor, right? The new **required** keyword workd pretty similarly but it will show an **error** on compiler so you'll never miss a "required" anymore.

 

### "?" & "!"

Meet new "friends", the **question mark** and **exclamation mark**! The first one will label your class parameters as nullable and will warning you any time you try to use them without checking in if they are null. You can force-use a nullable parameter by adding a `!` after the name of it. Also the ? will change how you will create classes. Let's see an example:

```javascript
class MyButton extends StatelessWidget {
  const MyButton ({
    Key? key,
    required this.content,
    required this.onTap,
    this.color = azure,
    this.manualPadding,
  }) : super(key: key);

  final String content;
  final Function() onTap;
  final Color color;
  final EdgeInsets? manualPadding;

  @override
  Widget build(BuildContext context) {
    //MY build...
  }
}
```

 In this `MyButton` class we can see that "`content`" and "`onTap`" are required, "`color`" is not and "`manualPadding`" is nullable. This means:

- `content` and `onTap` should always be valorized or the compiler will show an error.
- `color` is a parameter which, if not valorized while creating MyButton, will have "azure" as a color.
- `manualPadding` is a nullable parameter, so while creating our class we can absolutely set it as null.

When you implement **null safety** also many main widgets' parameters can be set as `null` and you will receive warnings and errors by the compiler.

 

### "late"

The `late` keyword can be used if you are **SURE** it will be valorized before using it because the compiler **will not stop you** to use it, even if it is `null` (and in this case it will throw an error while running). Also it will show you a warning if you try to check if it is null as... It SHOULD NOT BE NULL!

```javascript
late List<String> allStrings;
```

 

### Wrapping all up

Null safety is not very easy to digest but will improve your app performance and awareness to possible issues with your code. It can be very scary at the beginning but you will go through it. And if you're not ready... No hassle! You can still stick to non-null safey!

Want to check more awesome Flutter tutorials? [Click here!](https://theotherdevs.com/starting-with-flutter/)