Why can't I convert a Number into a Double?

When parsing 100 from Firestore (which actually does not support a "number type", but converts it), it will by standard be parsed to an int.
Dart does not automatically "smartly" cast those types. In fact, you cannot cast an int to a double, which is the problem you are facing. If it were possible, your code would just work fine.

Parsing

Instead, you can parse it yourself:

double weight = json['weight'].toDouble();

Casting

What also works, is parsing the JSON to a num and then assigning it to a double, which will cast num to double.

double weight = json['weight'] as num;

This seems a bit odd at first and in fact the Dart Analysis tool (which is e.g. built in into the Dart plugin for VS Code and IntelliJ) will mark it as an "unnecessary cast", which it is not.

double a = 100; // this will not compile

double b = 100 as num; // this will compile, but is still marked as an "unnecessary cast"

double b = 100 as num compiles because num is the super class of double and Dart casts super to sub types even without explicit casts.
An explicit cast would be the follwing:

double a = 100 as double; // does not compile because int is not the super class of double

double b = (100 as num) as double; // compiles, you can also omit the double cast

Here is a nice read about "Types and casting in Dart".

Explanation

What happened to you is the following:

double weight;

weight = 100; // cannot compile because 100 is considered an int
// is the same as
weight = 100 as double; // which cannot work as I explained above
// Dart adds those casts automatically

You can do it in one line:

 double weight = (json['weight'] as num).toDouble();

You can Parse the data Like given below:

Here document is a Map<String,dynamic>

double opening = double.tryParse(document['opening'].toString());