【发布时间】:2022-07-24 04:25:52
【问题描述】:
我正在尝试使用 setState 更新 GridView.builder,当触发更改时,实际状态会在后台更新,但 GridView.builder 在我手动刷新应用程序之前不会更改。
setState 函数触发,我对此进行了测试。代码如下:
import 'package:flutter/material.dart';
import 'image_display_card.dart';
void main() {
runApp(MaterialApp(
home: ChooseScreen(),
));
}
class ChooseScreen extends StatefulWidget {
@override
State<ChooseScreen> createState() => _ChooseScreenState();
}
class _ChooseScreenState extends State<ChooseScreen> {
DisplayCard? currentSelectedCard;
// The List of image cards
List<DisplayCard> baseDisplayList = [];
// These are dummy images I added
List<Image> listOfInitialImages = const [
Image(image: AssetImage('images/testing_stock/stickFigureMale.png')),
Image(image: AssetImage('images/testing_stock/stickFigureFemale.png')),
Image(image: AssetImage('images/testing_stock/gown.png')),
Image(image: AssetImage('images/testing_stock/hat1.png')),
];
@override
void initState() {
super.initState();
baseDisplayList = [
for (int i = 0; i < listOfInitialImages.length; i++)
DisplayCard(
picture: listOfInitialImages[i],
onCardSelected: () {
setCardToSelected(i);
},
),
];
}
/// unselect the previous selected card and
/// set currentSelectedCard to the new selected card.
setCardToSelected(int index) {
if (currentSelectedCard != null) {
currentSelectedCard!.selectOrUnselect(false);
}
print('triggered');
// set the new selected card.
currentSelectedCard = baseDisplayList[index];
currentSelectedCard!.selectOrUnselect(true);
print('triggered again');
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Choose picture'),
),
body: GridView.builder(
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
),
itemCount: baseDisplayList.length,
itemBuilder: (BuildContext context, int index) {
return baseDisplayList[index];
},
),
);
}
}
这是display_card.dart:
import 'package:flutter/material.dart';
class DisplayCard extends StatelessWidget {
final Image picture;
final onCardSelected;
bool isSelected;
// TODO: Implement color change on selected picture
DisplayCard({
this.isSelected = false,
this.onCardSelected,
this.picture = const Image(
image: AssetImage('images/testing_stock/stickFigureMale.png')),
});
selectOrUnselect(bool choice) {
isSelected = choice;
}
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: onCardSelected,
child: Container(
height: 200,
margin: const EdgeInsets.all(5),
decoration: BoxDecoration(
color: Colors.grey[300],
image: DecorationImage(
image: picture.image,
colorFilter: ColorFilter.mode(
Colors.black.withOpacity(isSelected ? 0.4 : 0.0),
BlendMode.srcOver
),
fit: BoxFit.cover,
),
),
),
);
}
}
我已对其进行了编辑,使其仅包含复制错误所需的代码。之前很抱歉。
baseDisplayList 的状态已更新,但 GridView.builder 未重建。
关于我如何知道 GridView.builder 没有重建,我尝试在 setCardToSelected 函数中更改脚手架的 backgroundColor 并且背景颜色发生了变化,但 GridView 没有改变。但是当我之后立即刷新应用程序时,GridView 更新了。
请问,当setCardToSelected 被调用时,如何更新GridView.builder?
谢谢。感谢您的帮助。
【问题讨论】:
-
可以发一下
SelectedCard和DisplayCard类的代码吗? -
你怎么知道
GridBuilder没有重建? -
请将更新后的商品重新设置为列表。
-
你在哪里使用
currentSelectedCard?
标签: flutter dart setstate gridview.builder