如何解决为什么根据我使用的绑定语法,回调堆栈的大小会超过?
我有两个代码变体,应该仅在语法上有所不同,但是也许我错了。第一个结果是“回调堆栈大小超过” /“递归过多”。
SizedBox()
通过像这样更改
@override
Widget build(BuildContext context) {
return Scaffold(
body: Row(
children: [
NavigationRail(
onDestinationSelected: (newIndex) {
setState(() {
selectedindex = newIndex;
});
},elevation: 3,backgroundColor: Colors.green[100],groupAlignment: 0,selectedindex: selectedindex,destinations: [
NavigationRailDestination(
icon: Icon(Icons.home_outlined),label: Text('Home'),),NavigationRailDestination(
icon: Icon(Icons.event_available),label: Text('Events'),NavigationRailDestination(
icon: Icon(Icons.local_parking_outlined),label: Text('Parking'),NavigationRailDestination(
icon: Icon(Icons.fastfood_outlined),label: Text('Food'),NavigationRailDestination(
icon: Icon(Icons.medical_services_outlined),label: Text('S.O.S.'),],Expanded(
child: Stack(
children: <Widget>[list[selectedindex],)
],);
}
}
函数,可以避免该问题:
main :: Effect Unit
main = do
w <- window
loop w
loop :: Window -> Effect Unit
loop w = redraw <* requestAnimationFrame (loop w) w
redraw :: Effect Unit
redraw = log "Redrawing endlessly!"
为什么?
解决方法
loop
函数的第一个版本始终会立即无条件地调用自身:
loop w = redraw <* requestAnimationFrame (loop w) w
^^^^^^^^
right here
每次有人呼叫loop
时,都会立即立即呼叫loop w
。它必须立即调用loop w
,因为它需要返回值作为第一个参数传递给requestAnimationFrame
,它需要将第二个参数传递给运算符<*
,它需要调用提供自己的返回值。无限循环,就在那儿。
然而,do
语法变成了lambda表达式和对运算符>>=
的调用,像这样:
loop w =
redraw >>= (\x -> requestAnimationFrame (loop w) w $> unit)
此处,递归调用loop w
不会立即发生,而是包装在lambda表达式中,然后作为第二个参数传递给运算符>>=
。只有在评估lambda表达式的主体时,才会进行递归调用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。