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

Flutter:从其他Widget更新Hook值及文本控制器值不更新问题

问题分析与解决

你的问题核心在于:CustomHookWidget只会在自身Hook状态(比如customHook)变化时重建,而useTextEditingController的text更新并不会触发组件重建。这就导致TheStatelessWidget拿到的text一直是初始的空字符串,即便你在输入框里输入了内容,子组件也感知不到。

下面是两种直接有效的解决方式:

方式一:监听TextEditingController的变化,触发父组件重建

在CustomHookWidget中用useListenable监听controller,这样当controller的文本变化时,会触发组件重建,将最新的text传递给子组件:

class CustomHookWidget extends HookWidget {
  const CustomHookWidget({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    final controller = useTextEditingController();
    // 监听controller,文本变化时触发组件重建
    useListenable(controller);
    final customHook = useState(0);

    return Scaffold(
      body: Column(
        children: [
          TextField(controller: controller),
          TheStatelessWidget(
            hook: customHook,
            text: controller.text,
          ),
        ],
      ),
    );
  }
}

方式二:直接传递TextEditingController给子组件

不需要传递text,而是把整个controller传给子组件,这样点击按钮时直接读取controller.text的最新值:

// 修改父组件传递参数
class CustomHookWidget extends HookWidget {
  const CustomHookWidget({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    final controller = useTextEditingController();
    final customHook = useState(0);

    return Scaffold(
      body: Column(
        children: [
          TextField(controller: controller),
          TheStatelessWidget(
            hook: customHook,
            controller: controller, // 传递controller
          ),
        ],
      ),
    );
  }
}

// 修改子组件接收参数
class TheStatelessWidget extends HookWidget {
  final ValueNotifier<int> hook;
  final TextEditingController controller;

  const TheStatelessWidget({
    Key? key,
    required this.hook,
    required this.controller,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return ElevatedButton(
      onPressed: () {
        final currentText = controller.text;
        if (currentText.isEmpty) {
          print('empty');
          print(currentText);
        } else {
          hook.value += 1;
        }
      },
      child: const Text('Change Value'),
    );
  }
}

补充说明

方式二更高效,因为不需要触发父组件的重建,直接在子组件中获取实时文本;方式一则通过监听让父组件传递最新值,适合需要在父组件中也依赖文本变化的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 14:43:24