所以我知道關于這個問題有一些類似的問題,但沒有一個對我有用。我有一個帶有不同 CheckboxListTiles 的 ListView,當我向下滾動并選擇一個專案時,ListView 會自動跳到頂部。有沒有辦法防止這種情況發生?非常感謝你!我添加了截圖,以便您更好地理解。這是我的代碼:
class CheckboxWidget extends StatefulWidget {
const CheckboxWidget({
Key key,
this.item,
this.type,
this.state,
}) : super(key: key);
final Map<String, bool> item;
final String type;
final Map<String, dynamic> state;
@override
State<CheckboxWidget> createState() => _CheckboxWidgetState();
}
class _CheckboxWidgetState extends State<CheckboxWidget> {
@override
void initState() {
super.initState();
if (widget.state[widget.type].isEmpty) {
widget.item.updateAll((key, value) => value = false);
}
}
bool isChecked = false;
@override
Widget build(BuildContext context) {
final FilterProvider filterProvider = Provider.of<FilterProvider>(context);
return Expanded(
child: ListView(
key: UniqueKey(),
children: widget.item.keys.map(
(key) {
return CheckboxListTile(
contentPadding: EdgeInsets.only(left: 2, right: 2),
title: Text(
key,
style: TextStyle(fontSize: 19, fontWeight: FontWeight.w400),
),
value: widget.item[key],
activeColor: Color(0xffF6BE03),
checkColor: Color(0xff232323),
shape: CircleBorder(),
//contentPadding: EdgeInsets.all(0),
onChanged: (value) {
value
? filterProvider.multifiltervalue = [widget.type, key]
: filterProvider.multifiltervalue = [
widget.type,
key,
false
];
setState(
() {
widget.item[key] = value;
},
);
},
);
},
).toList(),
),
);
}
}
uj5u.com熱心網友回復:
可能是因為key: UniqueKey(),當您呼叫setStatebuild 函式時這一行再次構建了它的小部件,并且ListView會有一個新的,UniqueKey所以它會重建串列,因為它認為它是一個不同的小部件
洗掉此行key: UniqueKey(),,它應該可以正常作業
uj5u.com熱心網友回復:
CheckboxListTile 是一個無狀態小部件... setState 正在重繪整個串列。
你可以把它包裝CheckboxListTile成一個有狀態的小部件或一個StatefulBuilder......如果你在里面呼叫 setState 則StatefulBuilder只有這部分應該被重繪..
另一種方法可能是保存滾動位置......但我認為只重繪你改變的螢屏部分更聰明:-)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/391693.html
