颤振让孩子在列内匹配另一个孩子的宽度

Posted

技术标签:

【中文标题】颤振让孩子在列内匹配另一个孩子的宽度【英文标题】:Flutter have child match another child's width inside of Column 【发布时间】:2020-02-16 12:24:34 【问题描述】:

我正在尝试创建一个“事件”小部件,它由排列在一列中的两个文本小部件组成。事件小部件的宽度由第一个文本小部件(标题)确定。第二个文本(详细信息)应受标题宽度的限制并换行到下一行。这就是我想要的:https://i.imgur.com/Tksx9ZG.png

我已经尝试过这种布局,但是列的宽度设置为详细文本的宽度(最大的孩子)

Column(
  mainAxisAlignment: MainAxisAlignment.start,
  children: [
    Text("Title"),
    Text("Some longer text that should wrap")
  ]
)

【问题讨论】:

你试过用容器包裹它吗,比如:***.com/a/51931091/884522? 我有,但是如果我不设置容器的宽度,它将扩展以适合详细文本(而不是强制它换行到下一行)。为了设置容器的宽度,我需要知道标题文本在构建时的宽度。 final RenderBox box = context.findRenderObject(); then box.size 可能会满足您的需求,但可能不是正确的方式。 【参考方案1】:

解决方案完整代码:

import 'package:flutter/material.dart';

void main() => runApp(const MyApp());

class MyApp extends StatelessWidget 
  const MyApp(Key? key) : super(key: key);

  @override
  Widget build(BuildContext context) 
    return const MaterialApp(
      title: 'Flutter Demo',
      home: MyHomePage(),
    );
  


class MyHomePage extends StatefulWidget 
  const MyHomePage(Key? key) : super(key: key);

  @override
  State<MyHomePage> createState() => _MyHomePageState();


class _MyHomePageState extends State<MyHomePage> 
  final GlobalKey _globalKey = GlobalKey();
  double? titleWidth;

  @override
  void initState() 
    super.initState();
    WidgetsBinding.instance?.addPostFrameCallback((_) 
      RenderBox renderBox =
          _globalKey.currentContext?.findRenderObject() as RenderBox;
      setState(() 
        titleWidth = renderBox.size.width;
      );
    );
  

  @override
  Widget build(BuildContext context) 
    return Scaffold(
      body: Center(
        child: ConstrainedBox(
          constraints: titleWidth == null
              ? const BoxConstraints()
              : BoxConstraints(
                  maxWidth: titleWidth!,
                ),
          child: Column(
            mainAxisSize: MainAxisSize.min,
            mainAxisAlignment: MainAxisAlignment.start,
            children: [
              Text(
                "Your Title Here",
                key: _globalKey,
                style: const TextStyle(color: Colors.red),
              ),
              const Text("Some longer text that should wrap")
            ],
          ),
        ),
      ),
    );
  

结果:

【讨论】:

【参考方案2】:

所以我知道我在这个问题上迟到了。但我和你有同样的问题。在四处搜索之后,我很惊讶还没有人写过关于这个的包。

所以我做了:https://pub.dev/packages/flex_with_main_child

它看起来像这样:

ColumnWithMainChild(
  mainAxisAlignment: MainAxisAlignment.start,
  mainChild: Text("Title"),
  childrenBelow: [
    Text("Some longer text that should wrap"),
  ]
)

【讨论】:

以上是关于颤振让孩子在列内匹配另一个孩子的宽度的主要内容,如果未能解决你的问题,请参考以下文章

如何设置gridview的孩子的宽度以匹配屏幕宽度?

有两个孩子的父 div。即使没有显示另一个孩子,也总是让一个孩子填充父母?

列内的列不会填充宽度

有没有办法在颤振应用程序中使用firebase查找具有相同孩子名字的孩子的总数?

颤振错误:每个孩子必须恰好布置一次。关于建筑布局

文本溢出:省略号和 flex