Flutter学习之旅-1 ListView里有TextField,TextField滑出屏幕,再滑入屏幕时,已输入的内容会被清掉

场景:屏幕里有一个三个TextField,放在ListView里,如下图

当输入ListVIew上滚动,三个TextField滚出界面后,再把ListView滚动回顶部,只有焦点所在的TextField里的内容不会被清除,其他两个TextField的内容不见了,如下

原因及解决方案:造成此问题的原因,经过log验证,应该是TextField作为一个Widget,被滑出屏幕,又滑回来,没有焦点的Widget的initState和build方法会被重新执行,也就是Widget会被重建,重建时原有的状态不会自动恢复,里面的文字自然就消失了,解决方法是把TextField封装成一个StatefulWidget,然后用AutomaticKeepAliveClientMixin来保证TextField不会被回收。核心代码如下

class _TextFieldWidgetState extends State<TextFieldWidget> with AutomaticKeepAliveClientMixin  {//关键代码:AutomaticKeepAliveClientMixin保存状态
  Function callback;
  String title;

  @override
  bool get wantKeepAlive => true; //关键代码:重写get wantKeepAlive并设置为true

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
  }

  @override
  Widget build(BuildContext context)  {

    return TextField(
      inputFormatters: [PrecisionLimitFormatter(2)],
      keyboardType: TextInputType.numberWithOptions(),
      decoration: InputDecoration(
        contentPadding: const EdgeInsets.symmetric(vertical: 10.0,horizontal: 10.0),
        labelText: widget.title, // 文字提示
        border: OutlineInputBorder(
          borderRadius: BorderRadius.circular(15),
        ),
        filled: true, // 是否填充背景
        fillColor: Colors.white, // 填充颜色
      ),
      style: TextStyle(fontSize: ScreenUtil().setSp(TextStyleManager.TextEditSize),color: TextStyleManager.NumColor),//输入文本的样式
      onChanged: (value){
        widget.callback(value);
      }, // 当点击确定时调用的函数2
    );
  }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值