提供者更新变量,但旧值被传递给依赖它的函数
Posted
技术标签:
【中文标题】提供者更新变量,但旧值被传递给依赖它的函数【英文标题】: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。通过将提供程序对象传递给函数,代码现在可以正常工作。
【参考方案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),
),
),
);
【讨论】:
以上是关于提供者更新变量,但旧值被传递给依赖它的函数的主要内容,如果未能解决你的问题,请参考以下文章