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
相关产品推荐
相关产品推荐

