flutter - 如何将小部件放置在具有成比例大小和位置的小部件上方

标签 flutter dart widget flutter-layout

我希望将一组小部件按比例放置在背景小部件(图像小部件)上方。
enter image description here
我尝试了以下。
创建了 Widget数组并将其添加到 Stack二手 LayoutBuilder构建子小部件并使用 Positioned 定位它们小部件。
但由于 Incorrect use of ParentDataWidget. 而无法正常工作错误。

Widget build(BuildContext context) {
    final _widgetStack = <Widget>[];
    _widgetStack.add(Container(
      child: Image.network(
          'https://nikhileshwar96.github.io/Showcase/blue.jpg'),
      color: Color.fromARGB(255, 255, 255, 255),
    ));
    for (int _i = 1; _i < 5; _i++) {
      _widgetStack.add(LayoutBuilder(
          builder: (context, constrain) => Positioned(
                top: constrain.maxWidth * 0.5,
                left: constrain.maxHeight * 0.5,
                width: constrain.maxWidth * 0.25,
                height: constrain.maxHeight * 0.25,
                child: Container(
                  child: Text('HiTHERE'),
                  color: Color.fromARGB(255, 255, 0, 0),
                ),
              )));
    }

    return Container(
      child: Scaffold(
        appBar: AppBar(
          title: Text("Hi there"),
        ),
        body: 
          Container(
            height: 500,
            child: Stack(
              children: _widgetStack,
            ),
          )
      ),
    );
  }

最佳答案

尝试:

child: CustomMultiChildLayout(
  delegate: FooDelegate([
    Rect.fromLTWH(0, 0, 1, 1),
    Rect.fromLTWH(0.1, 0.1, 0.2, 0.05),
    Rect.fromLTWH(0.5, 0.1, 0.2, 0.05),
  ]),
  children: [
    LayoutId(id: 0, child: Container(color: Colors.grey)),
    LayoutId(id: 1, child: Material(color: Colors.red, child: InkWell(onTap: () {},))),
    LayoutId(id: 2, child: Material(color: Colors.blue, child: InkWell(onTap: () {},))),
  ],
)
定制MultiChildLayoutDelegate可能看起来像(但是如何实现委托(delegate)完全取决于您):
class FooDelegate extends MultiChildLayoutDelegate {
  final List<Rect> rects;

  FooDelegate(this.rects);

  @override
  void performLayout(Size size) {
    var id = 0;
    for (var rect in rects) {
      var childRect = Rect.fromLTWH(
        size.width * rect.left,
        size.height * rect.top,
        size.width * rect.width,
        size.height * rect.height);
      print('$childRect $size');
      positionChild(id, childRect.topLeft);
      layoutChild(id, BoxConstraints.tight(childRect.size));
      id++;
    }
  }

  @override
  bool shouldRelayout(MultiChildLayoutDelegate oldDelegate) => true;
}

关于flutter - 如何将小部件放置在具有成比例大小和位置的小部件上方,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64511161/

相关文章:

Flutter 聚合/将新项目添加到 PopupMenuButton 中的项目列表

dart - 如何禁用复选框 flutter

Android 更改小部件背景图片

flutter - 未聚焦时隐藏 TextField 的光标

dart - 实时 flutter

drop-down-menu - 如何在 flutter 中为下拉按钮制作圆角边框?

dart - flutter:根据不同的状态路由到不同的页面

flutter - 如何在抖动中获取音频文件的元数据?

javascript - 将 React 组件添加到 vanilla JS 文件

javascript - AngularJS - 在单个 AJAX 调用中检索多个小部件的数据