Flutter 颤振中的setState()方法在for循环中的最后一次调用之前不会更新视图 问题
我正在尝试使用Flutter构建一个排序可视化工具。我使用了一个Flutter 颤振中的setState()方法在for循环中的最后一次调用之前不会更新视图 问题,flutter,dart,setstate,statefulwidget,Flutter,Dart,Setstate,Statefulwidget,我正在尝试使用Flutter构建一个排序可视化工具。我使用了一个CustomPainter来绘制与我要排序的整数列表的值相对应的垂直线。 应用程序的设置应确保当用户从下拉按钮中单击“气泡排序”选项时 (我打算稍后添加更多排序算法)CustomPainter画布中的垂直线必须自行排序 代码 导入'dart:io'; 导入“dart:math”; 进口“包装:颤振/基础.dart”; 进口“包装:颤振/材料.省道”; void main()=>runApp(HomePage()); 类主页扩展了St
CustomPainter
来绘制与我要排序的整数列表的值相对应的垂直线。
应用程序的设置应确保当用户从下拉按钮中单击“气泡排序”选项时
(我打算稍后添加更多排序算法)CustomPainter画布中的垂直线必须自行排序
代码
导入'dart:io';
导入“dart:math”;
进口“包装:颤振/基础.dart”;
进口“包装:颤振/材料.省道”;
void main()=>runApp(HomePage());
类主页扩展了StatefulWidget{
@凌驾
HomePageSate createState(){
返回HomePageState();
}
}
类HomePageState扩展了状态{
列表arr;
@凌驾
void initState(){
super.initState();
arr=_getRandomIntegerList();
}
@凌驾
小部件构建(构建上下文){
返回材料PP(
家:脚手架(
appBar:appBar(
标题:文本(“排序可视化程序”),
行动:[
下拉按钮(
onChanged:(动态选择){
开关(选择){
“气泡排序”案例:
_bubbleSortVisualiser();
打破
}
},
项目:[“气泡排序”]
.map((字符串值){
返回下拉菜单项(
价值:价值,
子项:文本(值),
);
}).toList(),
)
],
),
//下面的flatButton刷新arr以获得一个新的随机整数数组。
底部导航栏:扁平按钮(
已按下:(){
设置状态(){
arr=_getRandomIntegerList();
});
},
子:图标(Icons.refresh),
),
车身:定制喷漆(
大小:大小(双无限,双无限),
画家:分类画布(arr),
),
),
);
}
//函数使用气泡排序对列表进行排序,并在每次迭代时重新绘制画布。
void _bubbleSortVisualiser(){
打印('调用气泡排序函数');
List-bubbleArr=List.from(arr);
for(int i=0;i
class HomePageState extends State<StatefulWidget> {
类HomePageState扩展状态{
应该是
class HomePageState extends State<HomePage> {
类HomePageState扩展状态{
就这些了,到时候应该行了
此外,您还应更改以下内容:
@override
State<StatefulWidget> createState() {
return HomePageState();
}
@覆盖
状态createState(){
返回HomePageState();
}
致:
@覆盖
State createState()=>HomePageState();
尝试使用Future.delay like
void _bubbleSortVisualiser() async {
print('Bubble sort function called');
List<int> bubbleArr = List.from(arr);
for (int i = 0; i < bubbleArr.length - 1; i++) {
for (int j = 0; j < bubbleArr.length - 1 - i; j++) {
int temp;
if (bubbleArr[j] < bubbleArr[j + 1]) {
temp = bubbleArr[j];
bubbleArr[j] = bubbleArr[j + 1];
bubbleArr[j + 1] = temp;
//Every time arr changes setState() is called to visualise the changing array.
await Future.delayed(const Duration(seconds: 1), () {
setState(() {
arr = List.from(bubbleArr);
print("Updated to : $arr");
});
});
}
}
}
}
}
void\u bubbleSortVisualiser()异步{
打印('调用气泡排序函数');
List-bubbleArr=List.from(arr);
for(int i=0;i
感谢您指出这些错误。我已经纠正了这些错误,但问题仍然存在。我正在寻找一种方法来延迟对有状态小部件的中间重新绘制。在任何情况下,我都用您的更正编辑了问题中的代码。应用程序的运行方式是:我按下下拉按钮,应用程序似乎会冻结一段时间一段时间后,屏幕上的数组直接转换为排序的数组。您认为问题出在哪里?您是否尝试过完全重新启动应用程序?bubbleSortVisualizer()中的setState()函数。我正在使用它用部分排序的列表更新列表成员变量。是的,我尝试重新启动应用程序,但没有有效地将list.from(bubbleArr)
提取到它上面自己的变量中(不在setState()
)或者更好的方法是修改\u bubbleSortVisualizer()
的返回类型,并返回列表。从(bubbleArr)
并设置调用该方法的状态。是的,它可以工作!谢谢。使用sleep()毕竟是错误的。
@override
State<HomePage> createState() => HomePageState();
void _bubbleSortVisualiser() async {
print('Bubble sort function called');
List<int> bubbleArr = List.from(arr);
for (int i = 0; i < bubbleArr.length - 1; i++) {
for (int j = 0; j < bubbleArr.length - 1 - i; j++) {
int temp;
if (bubbleArr[j] < bubbleArr[j + 1]) {
temp = bubbleArr[j];
bubbleArr[j] = bubbleArr[j + 1];
bubbleArr[j + 1] = temp;
//Every time arr changes setState() is called to visualise the changing array.
await Future.delayed(const Duration(seconds: 1), () {
setState(() {
arr = List.from(bubbleArr);
print("Updated to : $arr");
});
});
}
}
}
}
}