Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android UI在简单异步计算中冻结_Android_Flutter_User Interface_Dart_Async Await - Fatal编程技术网

Android UI在简单异步计算中冻结

Android UI在简单异步计算中冻结,android,flutter,user-interface,dart,async-await,Android,Flutter,User Interface,Dart,Async Await,上下文 我正在开发一个按时间顺序执行某些操作的函数,我希望能够暂停它的执行,然后按下按钮继续 问题 使用下面的代码,当代码到达await Future.doWhile(()=>\u istestpused)时,UI被冻结 代码 导入“包装:颤振/材料.省道”; 类示例扩展StatefulWidget{ 常量样本(); @凌驾 _SampleState createState()=>_SampleState(); } 类_SampleState扩展状态{ 字符串-文本; bool(不支持);; @

上下文

我正在开发一个按时间顺序执行某些操作的函数,我希望能够暂停它的执行,然后按下按钮继续

问题

使用下面的代码,当代码到达
await Future.doWhile(()=>\u istestpused)时,UI被冻结

代码

导入“包装:颤振/材料.省道”;
类示例扩展StatefulWidget{
常量样本();
@凌驾
_SampleState createState()=>_SampleState();
}
类_SampleState扩展状态{
字符串-文本;
bool(不支持);;
@凌驾
void initState(){
_文本='';
_istestpused=false;
WidgetsBinding.instance.addPostFrameCallback((\u)=>\ u run());
super.initState();
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
正文:安全区(
子级:展开(子级:文本(_-Text)),
),
浮动操作按钮:浮动操作按钮(
按下时:()=>设置状态(()=>\u istestpused=!\u istestpused),
子:图标(_istestpused?Icons.play_箭头:Icons.pause),
),
);
}
Future\u run()异步{
整数计数=0;
对于(int i=0;i<100;i++){
等待未来。延迟(持续时间(秒:1));
等待未来。等待未来(()=>);
设置状态(()=>_text+='${count+=1}\n');
}
}
}

您在
等待未来时阻止了您的代码。虽然
事实上,即使您没有使用
等待
也会阻止,这是因为dart是单线程的

当您到达一个异步函数时,dart不会创建一个单独的线程,它只是传递该函数,当它准备好时,它会告诉事件循环并位于行的后面。非常类似于Nodejs处理事情的方式

您可以使用
dart:async
中的
compute
跨隔离运行昂贵的操作,但我不知道是否可以通过更改某些状态来停止循环的执行。但不管你想做什么,这可能不是正确的方法


祝你好运

你在
等待未来时阻塞了你的代码。虽然
事实上,即使你没有使用
等待
你也会阻塞,这是因为dart是单线程的

当您到达一个异步函数时,dart不会创建一个单独的线程,它只是传递该函数,当它准备好时,它会告诉事件循环并位于行的后面。非常类似于Nodejs处理事情的方式

您可以使用
dart:async
中的
compute
跨隔离运行昂贵的操作,但我不知道是否可以通过更改某些状态来停止循环的执行。但不管你想做什么,这可能不是正确的方法


祝你好运

使用将来的方法来运行异步代码。然后使用Future Builder调用。由于flatter是单线程的,因此直接从内部调用async会使应用程序冻结。

使用将来的方法来运行异步代码。然后使用Future Builder调用。由于颤振是单线程的,因此直接从内部调用async会使应用程序冻结。

您可以使用生成器函数控制循环的执行。在这方面,你可以通过使用生成器函数来控制循环的执行。所以,看看它可能会在这方面帮助你。