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

Flutter中如何获取自定义Widget类的变量值

实现方案

你当前的写法存在两个不符合Flutter设计规范的问题:

  • StatelessWidget为不可变组件,内部定义可变的valor变量在组件重建时值会直接丢失
  • 子组件内的状态需要向外传递时,不要在子组件内部持有需要跨组件访问的状态,通过回调传值是最直接的实现方式。

步骤1:修改自定义TextBox组件

删除组件内部持有的valor变量,新增值变化回调参数,输入内容变动时直接把值通过回调抛出:

import 'package:flutter/material.dart';

class TextBox extends StatelessWidget {
  final double largura;
  final double tamanhoLetra;
  // 新增回调,用于把输入值传递给父组件
  final void Function(String valor) onValorChanged;

  const TextBox({
    super.key,
    required this.largura,
    required this.tamanhoLetra,
    required this.onValorChanged,
  });

  @override
  Widget build(BuildContext context) {
    return SizedBox(
      width: largura,
      child: TextField(
        style: TextStyle(
          fontSize: tamanhoLetra,
        ),
        textAlign: TextAlign.left,
        onChanged: (String text) {
          // 输入变化时触发回调,把最新值传给父组件
          onValorChanged(text);
        },
      ),
    );
  }
}

步骤2:父组件调用时接收传递的值

在调用TextBox的父页面(建议用StatefulWidget承载状态)定义自己的变量,通过传入的回调接收子组件抛出的值即可:

// 父组件的State类中定义用于接收输入值的变量
String targetValor = '';

// 组件树中调用TextBox的代码修改为如下形式
TextBox(
  largura: 100, 
  tamanhoLetra: 25,
  onValorChanged: (String novoValor) {
    // 接收到子组件传的最新值,赋值给自身变量
    // 状态更新需要调用setState触发页面刷新
    setState(() {
      targetValor = novoValor;
    });
  },
)

扩展方案(可选)

如果后续你需要主动控制输入框(比如设置默认值、清空内容、主动获取值),可以用TextEditingController方案:父组件初始化Controller实例传给TextBox的TextField,后续直接通过controller.text就能随时获取当前输入内容,不需要依赖回调传值。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 10:15:55