【问题标题】:Provider updates variable, but the old value is passed into function that depend on it提供者更新变量,但旧值被传递给依赖它的函数
【发布时间】:2021-01-21 22:15:24
【问题描述】:

我正在使用提供程序将输入字段的值存储在表单中。在 save() 方法中,TextFields 调用 FormInputProvider 上的一个方法,该方法更新保存更新后的输入值的变量 inputAnn。

_inputAnn 正在监听提供者的变量 inputAnn。

当我调用函数 _upDateAnnouncementProvider 时,我将公告 _inputAnn 添加到包含表单输入信息的公告列表中。但是 _inputAnn 的值不会由 inputAnn 提供者更新。

我试过因此插入一个异步函数: _upDateAnnouncementProvider 函数外的 2 条打印消息已更新,但 async 函数内的打印消息仍然是旧的。

有人可以帮忙吗?如有必要,我可以提供更多代码。

谢谢。

Widget build(BuildContext context) {
    var _inputAnn = Provider.of<FormInputProvider>(context).inputAnn;

    print('FORM SCREEN BUILD BEFORE : images:  ${_inputAnn.images.first}');

    Future<void> _upDateAnnouncementProvider() async {
      Future.delayed(Duration.zero).then((value) {
        Provider.of<Announcements>(context, listen: false).addItem(_inputAnn);
        print('INSIDE UPDATE PROVIDER: images:  ${_inputAnn.images.first}');
      });
    }

    print('FORM SCREEN BUILD: images:  ${_inputAnn.images.first}');
    loadHomeTypeList();
    return Scaffold(
      appBar: AppBar(
        title: Text('Aggiungi Annuncio'),
      ),
      body: Padding(
        padding: EdgeInsets.all(16.0),
        child: FormBody(
          scrollController: _scrollController,
          formKey: _formKey,
          getFormFields: () => _getFormFields(context, _inputAnn),
          saveForm: _saveForm,
          updateProvider: _upDateAnnouncementProvider,
        ),
      ),
    );
  }

【问题讨论】:

  • 您是否尝试将函数_upDateAnnouncementProvider() 放在构建函数之外并通过传递_inputAnn 作为参数调用它?
  • 如果您使用无状态小部件,您可能还需要将 buildcontext 或提供程序对象作为参数传递。
  • 谢谢@yellowgray。通过将提供程序对象传递给函数,代码现在可以正常工作。

标签: flutter asynchronous flutter-provider flutter-change-notifier flutter-form-builder


【解决方案1】:

通过将 Provider 对象传递给构建之外的函数,代码现在可以正常工作。

void _upDateAnnouncementProvider(FormInputProvider _inputAnnData) {
    Provider.of<Announcements>(context, listen: false)
        .addItem(_inputAnnData.inputAnn);
    print(
        'INSIDE UPDATE PROVIDER: images:  ${_inputAnnData.inputAnn.images.first}');
  }

  @override
  Widget build(BuildContext context) {
    final _inputAnnData = Provider.of<FormInputProvider>(context);
    var _inputAnn = _inputAnnData.inputAnn;

    print('FORM SCREEN BUILD: images:  ${_inputAnn.images.first}');

    loadHomeTypeList();
    return Scaffold(
      appBar: AppBar(
        title: Text('Aggiungi Annuncio'),
      ),
      body: Padding(
        padding: EdgeInsets.all(16.0),
        child: FormBody(
          scrollController: _scrollController,
          formKey: _formKey,
          getFormFields: () => _getFormFields(context, _inputAnn),
          saveForm: _saveForm,
          updateProvider: () => _upDateAnnouncementProvider(_inputAnnData),
        ),
      ),
    );
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-19
    • 1970-01-01
    • 1970-01-01
    • 2017-01-15
    • 2021-09-23
    • 1970-01-01
    • 2016-03-17
    • 1970-01-01
    相关资源
    最近更新 更多