gpt4 book ai didi

flutter - ListView.builder 中的 TextFields 正在消失

转载 作者:行者123 更新时间:2023-12-05 06:12:09 26 4
gpt4 key购买 nike

为了进行库存控制,我从 Firebase 数据(“Alimentos”列表)和一个 TextField 构建一个 ListView 来编辑每个“Alimento”的数量。

当我的“Alimentos”屏幕少于一个屏幕时它工作正常,但是当我有一些“Alimentos”页面时,我的文本字段正在消失。我知道发生这种情况是因为 ListView.builder 只会构建视口(viewport)内或附近的项目(当您滚动时),但我不知道如何解决它。

我读了Textfield in ListView.builder Post ,@Ashton Thomas 建议在每行中实现自定义小部件,但我不明白如何实现。

这是我的 ListView.Builder...

  Widget _crearListado(BuildContext context, AlimentoBloc alimentoBloc) {

final _size = MediaQuery.of(context).size;

return Container(
height: _size.height * 0.5,
child: StreamBuilder(
stream: alimentoBloc.alimentoStream ,
builder: (BuildContext context, AsyncSnapshot<List<AlimentoModel>> snapshot){
if (snapshot.hasData) {
List<AlimentoModel> alimentos = snapshot.data;
alimentos.sort((a, b) => a.proteina.compareTo(b.proteina));
return Stack(
children: <Widget>[
ListView.builder(
itemCount: alimentos.length,
itemBuilder: (context, i) { //Esta variable es gráfica, sólo se crea para lo que se está viendo
_controlList.add(new ControlInventarioModel());
return _crearItem(context, alimentoBloc, alimentos[i], i);
},

padding: EdgeInsets.only(left: 10.0, right: 10.0, top: 0.0, bottom: 20.0),
),
],
);
} else {
return Center (child: Image(image: AssetImage('assets/Aplians-fish-Preloader.gif'), height: 200.0,));
}
},
),
);
}

每一行都有一个 Item (_CrearItem),其尾部 (_cajaNum) 有一个 TextField,如下所示:

  Widget _crearItem(BuildContext context, AlimentoBloc alimentoBloc, AlimentoModel alimento, int i) {

return Card(
color: Colors.grey[200], //color de la tarjeta
elevation: 0.0, //sin sombra
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(15.0)),
child: ListTile(
title: Text('${alimento.nombre}', style: TextStyle(color: Theme.of(context).primaryColor, fontSize: 18.0)),
subtitle: Text ('${alimento.fabricante}'), //refLoteActual
onTap: () {},
leading: Icon(FontAwesomeIcons.shoppingBag, color: Theme.of(context).accentColor),
trailing: _cajaNum(context, i, alimento.idAlimento),// nuevoControlador),
),
);
}

Widget _cajaNum(BuildContext context, int i, String idAlimento){
return Container(
width: 100.0,
height: 40.0,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(10.0),
),
child: TextField(
style: TextStyle(fontSize: 20.0),
textAlign: TextAlign.center,
keyboardType: TextInputType.numberWithOptions(),//decimal:false, signed: false),
inputFormatters: <TextInputFormatter>[
FilteringTextInputFormatter.allow(RegExp(r'^(\d+)?\.?\d{0,2}')),
FilteringTextInputFormatter.singleLineFormatter,
],
maxLength: 5,
onChanged: (value) {
if(utils.isNumeric(value) && double.parse(value)>=0) {
_controlList[i].cantControl = double.parse(value);
}
else {
_controlList[i].cantControl = null;
}
},
onEditingComplete: () {
FocusScope.of(context).unfocus();
},
onSubmitted: (value) {
},
),
);
}

如果我的 ListView 在滚动时不断重建,我该如何保留 TextFields 的值?

更新

我包括显示文本字段“消失”的屏幕截图...

Textfields Disappearing in ListView

最佳答案

这个问题需要了解ListView.builder的widget生命周期。看: https://api.flutter.dev/flutter/widgets/ListView-class.html#:~:text=Child%20elements%27%20lifecycle

Destruction

When a child is scrolled out of view, the associatedelement subtree, states and render objects are destroyed. A new childat the same position in the list will be lazily recreated along withnew elements, states and render objects when it is scrolled back.

那么,我们如何阻止 Flutter 破坏我们宝贵的子树和状态?

使用 AutoMaticKeepAliveClientMixin :)

使用这个 mixin 扩展你的状态类,如下所示:

class MyHomePageState extends State<MyHomepage> with AutomaticKeepAliveClientMixin

那么你必须做两件事:

添加wantKeepAlive覆盖:

@override   
bool get wantKeepAlive => true;

然后添加:

super.build(context);

就在您要保留的构建方法下。

如果在某些情况下您知道不再需要保留状态,您可以设置:

bool get wantKeepAlive => false;

希望这对您有所帮助。

关于flutter - ListView.builder 中的 TextFields 正在消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63697813/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com