微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么根据我使用的绑定语法,回调堆栈的大小会超过?

如何解决为什么根据我使用的绑定语法,回调堆栈的大小会超过?

我有两个代码变体,应该仅在语法上有所不同,但是也许我错了。第一个结果是“回调堆栈大小超过” /“递归过多”。

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 举报,一经查实,本站将立刻删除。