flutter 如果列表发生变化,我如何更新内部小部件,如果内部小部件发生变化,如何通知外部小部件?

qltillow  于 2023-08-07  发布在  Flutter
关注(0)|答案(3)|浏览(147)

我基本上有一个这样的结构:

--OuterWidget
  --ListWidget
    --ListElementWidget1
    --ListElementWidget2
    ...
    --ListElementWidget3

字符串
我想做的是:每当用户选中ListElementWidget中的复选框时,我希望在OuterWidget中得到有关通知。此外,每当我在OuterWidget中向列表添加元素时,我希望它能反映在ListWidget中。我可以在构造函数中传递一个通知器的简单方法,但是有更简单的方法吗?

ha5z0ras

ha5z0ras1#

欢迎来到国家管理的世界!
要知道ListElementWidget中的复选框是否发生了变化,最简单的方法是沿着链向下传递一个回调方法,就像您已经提到的那样,然后在用户选中复选框时调用该方法。

OuterWidget() => ListWidget(toggleCheckCallBack) => ListElementWidget(toggleCheckCallBack);

字符串
而且,对于ListWidget的更新,只需将OuterWidget设置为StatefulWidget并在添加元素时调用setState就可以解决这个问题。
虽然这确实解决了这个问题,但它可能不会很好地扩展,如果你认为这是一个问题,看看各种state management libraries Flutter。

zqdjd7g9

zqdjd7g92#

查看stateful widgets

void onPressed() {
  setState(() {
    // Here you can set values in your widget 
    // and it will update all widgets in state.
  });
}

字符串
对不起,如果代码错误,我从记忆中键入...完整代码示例:

class Page extends StatefulWidget {
  @override
  State createState(BuildContext context) => _PageState();
}

class _PageState extends State<Page> {
  int someValue = 0; 

  Widget build() => TextButton(
    text: Text(someValue.toString()),
    onPress: () => SetState(() {
      someValue += 4;
    })
  )
}

iezvtpos

iezvtpos3#

我用flutter notification mechanism解决了我的问题。
例如:

class ContainerHeightChangedNotification extends Notification {
 final double changedHeight;

 ContainerHeightChangedNotification(this.changedHeight);
}

字符串
然后,当内胆高度发生变化时,呼叫调度

ContainerHeightChangedNotification(
          widget.isFold ? 0 : widget.unfoldHeight - widget.foldHeight)
      .dispatch(context);


外,你应该包裹你的孩子

NotificationListener<ContainerHeightChangedNotification>(
  onNotification: (notification) {
    widget.height += notification.changedHeight;
    return true;
  },
  child: your child,
);


希望帮助

相关问题