Flutter 颤振中的setState()方法在for循环中的最后一次调用之前不会更新视图 问题

Flutter 颤振中的setState()方法在for循环中的最后一次调用之前不会更新视图 问题,flutter,dart,setstate,statefulwidget,Flutter,Dart,Setstate,Statefulwidget,我正在尝试使用Flutter构建一个排序可视化工具。我使用了一个CustomPainter来绘制与我要排序的整数列表的值相对应的垂直线。 应用程序的设置应确保当用户从下拉按钮中单击“气泡排序”选项时 (我打算稍后添加更多排序算法)CustomPainter画布中的垂直线必须自行排序 代码 导入'dart:io'; 导入“dart:math”; 进口“包装:颤振/基础.dart”; 进口“包装:颤振/材料.省道”; void main()=>runApp(HomePage()); 类主页扩展了St

我正在尝试使用Flutter构建一个排序可视化工具。我使用了一个
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");
              });
    });




        }
      }
    }
  }
}