7

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';

4

3 回答 3

8

只需在您的提供者中添加一个构造函数:

class StepInfo extends ChangeNotifier {

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

   [...]

}
于 2019-12-24T12:19:06.293 回答
1

您必须在 initstate 上设置 listen:false 和一些延迟

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

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

这种情况下或这个

于 2019-09-10T07:41:46.693 回答
0

更改AdminAddVaccination类中的initState()build()方法,如下所示:

var stepInfo;
  @override
  void initState() {
    super.initState();
    stepInfo = new StepInfo();
    stepInfo.addToList = new VaccStep();
  }

  @override
  Widget build(BuildContext context) {
    return new ChangeNotifierProvider<StepInfo>(
      builder: (context) => stepInfo,
      child: ScreenBody(),
    );
  }
于 2020-07-03T07:09:20.367 回答