当前位置: 首页 > 知识库问答 >
问题:

是否可以强制换行小部件中特定子小部件的对齐?

从开济
2023-03-14

我试图在flutter中创建一个布局,由一行和两个子小部件组成,第一个子部件向左对齐,第二个子部件向右对齐,如果容器太窄,这也将包装小部件。

这类似于这里提出的问题:Flutter将两个项极端地对齐--一个在左边,一个在右边,这可以通过wrap小部件来解决,小部件具有对齐方式:wrapalignment.spacebether。然而,当小部件使用此方法包装时,包装到新运行的右小部件不再右对齐。(截图)

我希望发生的是,右边的小部件在包装时保持与右边对齐。在使用flexbox的css中,这可以通过右边小部件上的flex-grow:1或margin-left:auto来实现,如本代码所示(调整页面宽度以查看我想要的布局)。

到目前为止,我在flutter中尝试过:

  • 灵活的小部件中包装右边的小部件,试图使它在包装时占据剩余的宽度,这样我就可以在其中对齐,但这会引发错误:
   Incorrect use of ParentDataWidget.
   Flexible widgets must be placed inside Flex widgets.
    null

那么,有没有可能创建一个布局,让右小部件在必须换行时保持与右边缘对齐?

共有1个答案

许丁雷
2023-03-14

由于Rémi Rousselet建议使用自定义的renderbox,这里有一个解决布局问题的基本实现(基于wrapwidgetsrenderbox实现1 2)

import 'package:flutter/widgets.dart';
import 'package:flutter/rendering.dart';
import 'dart:math' as math;

class LeftRightAlign extends MultiChildRenderObjectWidget {
  LeftRightAlign({
    Key key,
    @required Widget left,
    @required Widget right,
  }) : super(key: key, children: [left, right]);

  @override
  RenderLeftRightAlign createRenderObject(BuildContext context) {
    return RenderLeftRightAlign();
  }
}

class LeftRightAlignParentData extends ContainerBoxParentData<RenderBox> {}

class RenderLeftRightAlign extends RenderBox
    with
        ContainerRenderObjectMixin<RenderBox, LeftRightAlignParentData>,
        RenderBoxContainerDefaultsMixin<RenderBox, LeftRightAlignParentData> {

  RenderLeftRightAlign({
    List<RenderBox> children,
  }) {
    addAll(children);
  }

  @override
  void setupParentData(RenderBox child) {
    if (child.parentData is! LeftRightAlignParentData)
      child.parentData = LeftRightAlignParentData();
  }

  @override
  void performLayout() {
    final BoxConstraints childConstraints = constraints.loosen();

    final RenderBox leftChild = firstChild;
    final RenderBox rightChild = lastChild;

    leftChild.layout(childConstraints, parentUsesSize: true);
    rightChild.layout(childConstraints, parentUsesSize: true);

    final LeftRightAlignParentData leftParentData = leftChild.parentData;
    final LeftRightAlignParentData rightParentData = rightChild.parentData;

    final bool wrapped =
        leftChild.size.width + rightChild.size.width > constraints.maxWidth;

    leftParentData.offset = Offset.zero;
    rightParentData.offset = Offset(
        constraints.maxWidth - rightChild.size.width,
        wrapped ? leftChild.size.height : 0);

    size = Size(
        constraints.maxWidth,
        wrapped
            ? leftChild.size.height + rightChild.size.height
            : math.max(leftChild.size.height, rightChild.size.height));
  }

  @override
  bool hitTestChildren(HitTestResult result, {Offset position}) {
    return defaultHitTestChildren(result, position: position);
  }

  @override
  void paint(PaintingContext context, Offset offset) {
    defaultPaint(context, offset);
  }
}

...

class HomePageState extends State<HomePage> {
  @override
  Widget build(BuildContext context) {
    return CupertinoPageScaffold(
      navigationBar: CupertinoNavigationBar(middle: Text('App')),
      child: ListView(children: <Widget>[
        Container(
          margin: EdgeInsets.symmetric(horizontal: 32, vertical: 16),
          child: LeftRightAlign(
            left: Text(
              'Left Widget',
              style: TextStyle(fontSize: 40),
            ),
            right: Text(
              'Right Widget',
              style: TextStyle(fontSize: 40),
            ),
          ),
        ),
        Text('Next Line'),
      ])
    );
  }
}

 类似资料:
  • 我尝试了以下帖子中的建议,并查看了Moment.js转换日期UTC给出错误日期的文档 但最终结果是结果为1999-09-07T23:00:00.000z,因此没有存储正确的输入日期。 我现在正在使用以下formatDate函数格式化日期。但是,当我将计算机上的时区更改为智利时,日期1999-09-07 GMT-0200变为1999-09-08T00:00:00.000Z。 是不是我错过了什么?

  • 问题内容: 如果我能得到类似下面的信息,那将是很棒的。 伪代码: 在打印U时,将返回以下内容: 能够获得小部件设置将非常有用。这样我就可以相应地操纵其他小部件。 问题答案: 如果知道所需的设置,则可以使用该方法获取值,例如 它将打印 如果您想知道所有可用的选项,widget.config包含配置,并且如果您希望的话,可以创建您可能需要的全部或部分设置,例如 输出:

  • 问题内容: 我正在尝试创建一个向用户展示一些数据的活动。数据可以分为“单词”,每个单词都是一个小部件,“单词”的序列将构成数据(“句子”?),ViewGroup小部件包含这些单词。由于“句子”中所有“单词”所需的空间将超过显示器上可用的水平空间,因此,我想像平常的文本一样包装这些“句子”。 如下代码: 产生类似于左图的内容,但是我想要一种布局来呈现与右图相同的小部件。 是否有这样的布局或布局和参数

  • 我正在使用Kivy python库。 我定义了两个小部件。 当程序运行时,我运行第一个小部件。 当按下widgets按钮时,我希望它消失并被第二个widget替换。 这是两个小部件的. kv 我的主python文件运行应用程序,并返回第一个小部件 我的第一个小部件有一个回调。这就是问题代码所属的位置 这里的想法是有一个用户界面管理器。此管理器不像树那样运行UI,而是像列表和堆栈一样运行UI。该列表

  • 小部件是在视图中使用的可重用单元, 使用面向对象方式创建复杂和可配置用户界面单元。 例如,日期选择器小部件可生成一个精致的允许用户选择日期的日期选择器, 你只需要在视图中插入如下代码: <?php use yii\jui\DatePicker; ?> <?= DatePicker::widget(['name' => 'date']) ?> Yii提供许多优秀的小部件,比如 active for

  • 问题内容: 开发人员文档似乎使我失败了。我可以不假思索地创建一个静态窗口小部件,甚至可以创建一个会自动更新的类似模拟时钟窗口小部件的窗口小部件,但是,我一辈子都无法弄清楚如何创建一个在用户单击时做出反应的窗口小部件。它。这是开发人员文档提供的小部件活动应包含的内容的最佳代码示例(唯一的其他提示是API演示,它仅创建一个静态小部件): 来自:Android开发人员文档的小部件页面 因此,看起来像单击