Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I Initialize provider?

I have implemented Provider for state management in my app. Now, I need to add some data in the class once the screen is loaded.

How I can achieve this?

stepInfo.addToList = new VaccStep(); // Need to call it one time once screen is loaded.

I have tried to call this method from initState but it's giving error!!

class AdminAddVaccination extends StatefulWidget {
  @override
  State createState() => new AdminAddVaccinationState();
}

class AdminAddVaccinationState extends State<AdminAddVaccination> {

  @override
  void initState() {
    super.initState();
    var stepInfo = Provider.of<StepInfo>(context); // ERROR!!
    stepInfo.addToList = new VaccStep(); // ERROR!!
  }

  Widget build(BuildContext context) {
    return new ChangeNotifierProvider(
      builder: (context) => StepInfo(),
      child: ScreenBody(),
    );
  }
}

class ScreenBody extends StatelessWidget {


  @override
  Widget build(BuildContext context) {
    var stepInfo = Provider.of<StepInfo>(context);

    return new Scaffold(
        resizeToAvoidBottomPadding: false,
        key: stepInfo.scaffoldKey,
        body: new GestureDetector(
            onTap: () {
              FocusScope.of(context).requestFocus(new FocusNode());
            },
            child: new SafeArea(
              top: true,
              bottom: false,
              child: new Stack(children: <Widget>[
                new Opacity(
                  opacity: 0.04,
                  child: new Image.asset(
                    "assets/userProfile/heartBeat.png",
                    fit: BoxFit.cover,
                    height: 250.0,
                  ),
                ),
                new Column(
                  mainAxisAlignment: MainAxisAlignment.start,
                  crossAxisAlignment: CrossAxisAlignment.center,
                  children: <Widget>[
                    new Container(
                      color: primaryGreen,
                      width: double.infinity,
                      height: 65.0,
                      child: new Stack(
                        children: <Widget>[
                          new Align(
                              alignment: Alignment.center,
                              child: stepInfo.loading
                                  ? JumpingText('......')
                                  : new Container()),
                          new Align(
                            alignment: Alignment.centerLeft,
                            child: new Padding(
                              padding: EdgeInsets.only(top: 5.0, left: 20.0),
                              child: new InkWell(
                                child: new Container(
                                  child: Icon(
                                    Icons.arrow_back,
                                    color: Colors.white,
                                    size: 30.0,
                                  ),
                                ),
                                onTap: () {
                                  Navigator.pop(context);
                                },
                              ),
                            ),
                          ),
                        ],
                      ),
                    ),
                    new Padding(
                      padding: EdgeInsets.only(top: 0.0),
                      child: new Material(
                        elevation: 1.0,
                        color: Colors.transparent,
                        child: new Container(
                          color: borderColor,
                          width: double.infinity,
                          height: 5.0,
                        ),
                      ),
                    ),
                    VaccName(),
                  ],
                ),
                ItemListing(),
                AddStep(),
              ]),
            )));
  }
}

Error!! flutter: The following ProviderNotFoundError was thrown building Builder: flutter: Error: Could not find the correct Provider above this AdminAddVaccination Widget flutter: flutter: To fix, please: flutter: flutter: * Ensure the Provider is an ancestor to this AdminAddVaccination Widget flutter: * Provide types to Provider flutter: * Provide types to Consumer flutter: * Provide types to Provider.of() flutter: * Always use package imports. Ex: `import 'package:my_app/my_code.dart';

like image 917
Ahmed Abosrie Avatar asked Jun 10 '19 14:06

Ahmed Abosrie


2 Answers

Simply add a constructor in your provider :

class StepInfo extends ChangeNotifier {

   StepInfo() {
      this.addToList = new VaccStep();
   }

   [...]

}
like image 160
Yann39 Avatar answered Sep 21 '22 21:09

Yann39


You must set listen:false and some delay to on initstate

Provider.of<StepInfo>(context, listen: false);

Future.delayed(Duration(milliseconds: 100)).then((_) {
stepInfo.addToList = new VaccStep();
});

same in this case or this

like image 27
Finz Aiko Avatar answered Sep 19 '22 21:09

Finz Aiko