You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter Provider中ChangeNotifier类回调函数不生效问题求助

问题分析与解决

你的代码核心问题在于回调函数的嵌套定义错误,导致onChanged触发时并没有执行实际的赋值逻辑:

问题原因

abcInputs中的每个元素定义为(newValue) => () { ... },这是一个返回无参函数的函数(类型是Function(String) => void Function()),但TextFormField的onChanged需要的是直接接收String参数的函数(类型是void Function(String))。当输入变化时,onChanged只会调用外层的(newValue),得到内层的函数,但并没有执行这个内层函数,所以abc1的值根本不会被修改。

解决方案

直接将回调写成接收String参数并执行赋值+通知的函数,去掉多余的嵌套:

修正后的AbcClass代码

class AbcClass with ChangeNotifier {
  String abc1 = '111';
  String abc2 = '222';

  List<void Function(String)> get abcInputs {
    return [
      (newValue) {
        abc1 = newValue;
        notifyListeners();
      },
      (newValue) {
        abc2 = newValue;
        notifyListeners();
      }
    ];
  }
}

优化后的UI代码

另外,context.watch<AbcClass>()已经可以获取到监听状态的实例,无需再用context.read(),同时abc1本身就是字符串,不需要toString():

Widget build(BuildContext context) {
  final abcClass = context.watch<AbcClass>();
  
  return TextFormField(
    onChanged: abcClass.abcInputs[0],
    initialValue: abcClass.abc1,
  );
}

这样修改后,输入值变化时会直接触发回调中的赋值逻辑,abc1的值会更新,同时notifyListeners()会通知UI刷新。

内容的提问来源于stack exchange,提问作者Buddhika

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 19:52:14