【问题标题】:How can I Initialize provider?如何初始化提供程序?
【发布时间】:2019-10-24 23:19:11
【问题描述】:

我已经在我的应用程序中实现了状态管理 Provider。现在,加载屏幕后,我需要在类中添加一些数据。

我怎样才能做到这一点?

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

我试图从 initState 调用这个方法,但它给出了错误!!

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(),
              ]),
            )));
  }
}

错误!!颤振:抛出以下 ProviderNotFoundError 构建生成器:颤振:错误:找不到正确的 此 AdminAddVaccination Widget 上方的提供者颤动: 颤振:要修复,请:颤振:颤振:*确保 Provider 是这个 AdminAddVaccination Widget 的祖先 颤振:* 向 Provider 提供类型颤振:* 提供 消费者颤振的类型:*提供类型 Provider.of() 颤振:* 始终使用包导入。前任: `import 'package:my_app/my_code.dart';

【问题讨论】:

    标签: flutter flutter-provider


    【解决方案1】:

    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(),
        );
      }
    

    【讨论】:

    • 这将调用 StepInfo() 并在每次 UI 更新时重新分配 addTolist。
    【解决方案2】:

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

    class StepInfo extends ChangeNotifier {
    
       StepInfo() {
          this.addToList = new VaccStep();
       }
    
       [...]
    
    }
    

    【讨论】:

      【解决方案3】:

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

      Provider.of<StepInfo>(context, listen: false);
      
      Future.delayed(Duration(milliseconds: 100)).then((_) {
      stepInfo.addToList = new VaccStep();
      });
      

      thisthis 情况下相同

      【讨论】:

        猜你喜欢
        • 2023-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-16
        • 2020-08-03
        • 1970-01-01
        • 1970-01-01
        • 2022-08-14
        相关资源
        最近更新 更多