flutter - 如何更新 Flutter 中的 ValueListenableBuilder 值?
问题描述
我正在尝试与Provider一起实现ValueListenableBuilder。我有一个使用flutter_form_builder包构建的简单表单。
当显示以下屏幕时,它使用id参数显示交易详细信息。现在,当交易数据加载时,它会正确填写表格。然后我使用FormBuilderChoiceChip小部件编辑事务类型,我使用onChanged参数检测新值并使用ValueListenableBuilder相应地更新 UI 。一切都按预期工作。问题是第一次加载屏幕时以下逻辑不起作用。当我更改选择时,它会显示正确的值。
class EditTransactionViewArguments {
final int id;
EditTransactionViewArguments(this.id);
}
class EditTransactionView extends StatelessWidget {
final int id;
EditTransactionView({Key? key, required this.id}) : super(key: key);
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
final GlobalKey<FormBuilderState> _formKey = GlobalKey<FormBuilderState>();
final ValueNotifier<String?> selected = ValueNotifier('');
@override
Widget build(BuildContext context) {
final TransactionController transactionController = Provider.of<TransactionController>(context, listen: false);
transactionController.findOne(id);
return Scaffold(
key: _scaffoldKey,
backgroundColor: white,
body: Column(
children: [
Consumer<TransactionController>(
builder: (context, model, child) {
final TransactionWithCustomer? transaction = model.currentTransaction;
if (transaction != null) {
return Column(
children: [
FormBuilder(
key: _formKey,
child: Column(
children: [
ValueListenableBuilder<String?>(
valueListenable: selected,
builder: (context, value, _) {
return Column(
children: [
Text('Initial Value: ${transaction.transaction.type}'),
Text('Selected Value: $value'),
],
);
},
),
ValueListenableBuilder<String?>(
valueListenable: selected,
builder: (context, value, __) {
return FormBuilderChoiceChip(
name: 'type',
decoration: const InputDecoration(labelText: 'Type'),
initialValue: transaction.transaction.type,
options: [
FormBuilderFieldOption(
value: 'debit',
child: Row(
children: [
const Text('Debit'),
if (value == 'debit') const Icon(Icons.check, color: danger)
],
),
),
FormBuilderFieldOption(
value: 'credit',
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
const Text('Credit', style: TextStyle(color: success)),
if (value == 'credit') const Icon(Icons.check, color: success)
],
),
),
],
onChanged: (String? val) => selected.value = val,
);
},
),
],
),
),
],
);
} else {
return const CustomLoadingIndicator();
}
},
),
],
),
);
}
}
屏幕加载时,数据正确但无法更新 UI:
更改选择后,UI 更改已正确完成:
解决方案
推荐阅读
- sql - 如何根据每日股票报告为股票突变编写 SQL
- python - Python - 从没有方括号的字符串中提取数字
- java - timepicker 不显示仅小时棒棒糖版本 5.1.0
- java - java.time:如何验证日历周
- c++ - 在转换为 PUCHAR 并打印到控制台时,硬编码字符串给出的结果与从控制台读取的字符串不同
- java - XML 验证 - 未声明元素
- json - Google Assistant SDK 中的多个命令
- mongodb - 使用 ssl 从 spark 连接到 mongo docker
- php - 未连接适配器;跳过布局和 org.json.JSONException:Java.lang.String 类型的连接值无法转换为 JSONArray
- mysql - 如何将文件加载到特定列的 mysql 表中?