title: Manage multiple form (validation) in stepper flutter
body: <p>I have multiple form in each step of a Stepper, Form are in external file because in my App each Step can contain a different Form. I want that when user click on "Continue" the form will be validated and in an error situation the user will be warned. I tried to use Inherited Widget but it gives me a "null on getter". The code below:
  Screen that contain Steps</p>
  
  <pre><code>import 'package:flutter/material.dart';
  import 'package:pberrycoffeemaker/widgets/function_appbar.dart';
  import 'package:pberrycoffeemaker/widgets/inputs_0.dart';
  import 'package:pberrycoffeemaker/widgets/stepper_banner.dart';
  
  class FunctionScreen extends StatelessWidget {
    @override
    Widget build(BuildContext context) {
      int indexStep = 0;
      double bottomHeight = (MediaQuery.of(context).size.height * 40) / 100;
      double cardHeight = (MediaQuery.of(context).size.height * 60) / 100;
      double cardWidth = (MediaQuery.of(context).size.width * 85) / 100;
      FirstTypeInput firstTypeOfInput = FirstTypeInput();
      GlobalKey&lt;FormState&gt; key = new GlobalKey&lt;FormState&gt;();
      return Scaffold(
        body: Stack(
          children: &lt;Widget&gt;[
            AppbarBack(
              height: bottomHeight,
            ),
            Align(
              alignment: Alignment(0.0, .65),
              child: ClipRRect(
                borderRadius: BorderRadius.all(Radius.circular(15.0)),
                child: Container(
                  child: StepperBanner(
                    firstTypeInputKey: key,
                    test: 18,
                    firstTypeInputField: {},
                    child: Stepper(
                      currentStep: indexStep,
                      onStepContinue: (){
                        print(StepperBanner.of(context).test);
                        //StepperBanner.of(context).firstTypeInputKey.currentState.validate();
                      },
                      //type: StepperType.horizontal,
                      steps: &lt;Step&gt;[
                        Step(
                          content: firstTypeOfInput,
                          title: Text("Theorical"),
                        ),
                        Step(
                            content: //Second Step Content,
                            title: Text("Practical")),
                      ],
                    ),
                  ),
                  decoration: BoxDecoration(color: Colors.white, boxShadow: [
                    BoxShadow(
                        color: Colors.black,
                        blurRadius: 10.0,
                        offset: Offset(0.0, 0.75))
                  ]),
                  width: cardWidth,
                  height: cardHeight,
                ),
              ),
            ),
          ],
        ),
      );
    }
  }
  
  </code></pre>
  
  <p>Form contained in first Step</p>
  
  <pre><code>import 'package:flutter/cupertino.dart';
  import 'package:flutter/material.dart';
  import 'package:flutter/services.dart';
  import 'package:pberrycoffeemaker/functions/coffeeCalculation.dart';
  import 'package:pberrycoffeemaker/widgets/stepper_banner.dart';
  
  // ignore: must_be_immutable
  class FirstTypeInput extends StatefulWidget {
  
    final Map&lt;String, double&gt; submittedField = {
      "tds": 0.0,
      "ext": 0.0,
      "dw": 0.0,
      "af": 0.0,
      "co2": 0.0,
      "co2p": 0.0,
      "ih": 0.0,
      "ihp": 0.0,
      "wtemp": 0.0,
      "twh": 0.0,
      "alk": 0.0
    };
  
    @override
    State&lt;StatefulWidget&gt; createState() {
      return _FirstTypeInput();
    }
  }
  
  class _FirstTypeInput extends State&lt;FirstTypeInput&gt; {
    Map&lt;String, FocusNode&gt; _focusNodes;
    GlobalKey&lt;FormState&gt; formKey;
    @override
    void initState() {
      super.initState();
      _focusNodes = {
        "ext": new FocusNode(),
        "dw": new FocusNode(),
        "af": new FocusNode(),
        "co2": new FocusNode(),
        "co2P": new FocusNode(),
        "ih": new FocusNode(),
        "ihP": new FocusNode(),
        "wt": new FocusNode(),
        "twh": new FocusNode(),
        "alk": new FocusNode()
      };
    }
  
    String percentageValidator(String value){
      if (double.parse(value) &lt; 0 || double.parse(value) &gt; 100){
        return "Insert value between 0 - 100";
      }
      return null;
    }
  
    @override
    Widget build(BuildContext context) {
      return Form(
        key: StepperBanner.of(context).firstTypeInputKey,
        //key: widget.formKey,
        child: Column(
          children: &lt;Widget&gt;[
            // * TDS
            TextFormField(
              //validator: percentageValidator,
              onFieldSubmitted: (value) {
                FocusScope.of(context).requestFocus(_focusNodes["ext"]);
              },
              decoration: InputDecoration(
                  labelText: "TDS%", hintText: "Insert TDS%", suffix: Text("%")),
            ),
            // * EXT
            TextFormField(
              onFieldSubmitted: (value) {
                FocusScope.of(context).requestFocus(_focusNodes["dw"]);
              },
              focusNode: _focusNodes["ext"],
              decoration: InputDecoration(
                  labelText: "EXT%", hintText: "Insert EXT%", suffix: Text("%")),
            ),
            // * Drink Weight
            TextFormField(
              onFieldSubmitted: (value) {
                FocusScope.of(context).requestFocus(_focusNodes["af"]);
              },
              focusNode: _focusNodes["dw"],
              decoration: InputDecoration(
                  labelText: "Drink Weight",
                  hintText: "Insert drink weight",
                  suffix: Text("g")),
            ),
            // * Absorption Factor
            TextFormField(
              onFieldSubmitted: (value) {
                FocusScope.of(context).requestFocus(_focusNodes["co2"]);
              },
              focusNode: _focusNodes["af"],
              decoration: InputDecoration(
                  labelText: "Absorption Factor",
                  hintText: "Insert absorptio factor",
                  suffix: Text("g")),
            ),
            // * CO2
            TextFormField(
              onFieldSubmitted: (value) {
                FocusScope.of(context).requestFocus(_focusNodes["co2P"]);
              },
              focusNode: _focusNodes["co2"],
              decoration: InputDecoration(
                  labelText: "CO2", hintText: "Insert CO2", suffix: Text("g")),
            ),
            // * CO2 Precision
            TextFormField(
              onFieldSubmitted: (value) {
                FocusScope.of(context).requestFocus(_focusNodes["ih"]);
              },
              focusNode: _focusNodes["co2P"],
              decoration: InputDecoration(
                  labelText: "CO2 Precision",
                  hintText: "Insert CO2 Precision",
                  suffix: Text("%")),
            ),
            // * Internal Humidity
            TextFormField(
              onFieldSubmitted: (value) {
                FocusScope.of(context).requestFocus(_focusNodes["ihP"]);
              },
              focusNode: _focusNodes["ih"],
              decoration: InputDecoration(
                  labelText: "Internal Humidity",
                  hintText: "Insert internal humidity",
                  suffix: Text("%")),
            ),
            // * Internal Humidity Precision
            TextFormField(
              onFieldSubmitted: (value) {
                FocusScope.of(context).requestFocus(_focusNodes["wt"]);
              },
              focusNode: _focusNodes["ihP"],
              decoration: InputDecoration(
                  labelText: "Internal Humidity Precision",
                  hintText: "Insert internal humidity precision",
                  suffix: Text("%")),
            ),
            // * Water Temperature
            TextFormField(
              onFieldSubmitted: (value) {
                FocusScope.of(context).requestFocus(_focusNodes["twh"]);
              },
              focusNode: _focusNodes["wt"],
              decoration: InputDecoration(
                  labelText: "Water Temperature",
                  hintText: "Insert water temperature",
                  //TODO da decidere se settare nelle impostazioni l'unità di misura oppure mettere un dropdown sotto
                  suffix: Text("C°|F°|K°")),
            ),
            // * Total Water Hardness
            TextFormField(
              onFieldSubmitted: (value) {
                FocusScope.of(context).requestFocus(_focusNodes["alk"]);
              },
              focusNode: _focusNodes["twh"],
              decoration: InputDecoration(
                  labelText: "Total Water Hardness",
                  hintText: "Insert total water hardness",
                  //TODO da decidere se settare nelle impostazioni l'unità di misura oppure mettere un dropdown sotto
                  suffix: Text("PPM°|F°|D°")),
            ),
            // * Alkalinity
            TextFormField(
              focusNode: _focusNodes["alk"],
              decoration: InputDecoration(
                  labelText: "Alkalinity",
                  hintText: "Insert alkalinity",
                  //TODO da decidere se settare nelle impostazioni l'unità di misura oppure mettere un dropdown sotto
                  suffix: Text("PPM°|F°|D°")),
            ),
          ],
        ),
      );
    }
  }
  </code></pre>
  
  <p>Inherited Class, StepperBanner:</p>
  
  <pre><code>import 'package:flutter/material.dart';
  
  class StepperBanner extends InheritedWidget {
    final Map&lt;String, double&gt; firstTypeInputField;
    final GlobalKey&lt;FormState&gt; firstTypeInputKey;
    final int test;
  
    StepperBanner({Widget child, this.firstTypeInputField,this.test, this.firstTypeInputKey}) : super(child: child);
  
    @override
    bool updateShouldNotify(InheritedWidget oldWidget) =&gt; true;
  
    static StepperBanner of(BuildContext context) =&gt;
        context.inheritFromWidgetOfExactType(StepperBanner);
  }
  
  </code></pre>
  
  <p>Should I manage validation with Inherited Class or there are some other metods?</p>