【问题标题】:Tight wrap a long text around a container将长文本紧紧包裹在容器周围
【发布时间】:2021-02-12 00:15:48
【问题描述】:

如何将长文本紧紧包裹在容器周围。 MS word 有一个紧凑的包装功能。我需要将我的文本包裹在底部容器周围,使其看起来像上传的图像。

Stack(
      alignment: Alignment.topRight,
      children: [
        Padding(
          padding: EdgeInsets.only(bottom: 4, left: 4),
          child: Container(
            decoration: BoxDecoration(
                borderRadius: BorderRadius.circular(12),
                color: Color.fromRGBO(249, 249, 249, 1),
                // color: Colors.white,
                boxShadow: [
                  BoxShadow(
                    color: Colors.black.withOpacity(0.10),
                    spreadRadius: 1,
                    blurRadius: 5,
                    offset: Offset(3, 3),
                  )
                ]),
            child: Padding(
              padding: const EdgeInsets.symmetric(horizontal: 8.0),
              child: Column(
                children: [
                  Text(
                    "we pay close attention to every detail",
                    style: TextStyle(),
                    textAlign: TextAlign.right,
                  ),
                  Container(
                    alignment: Alignment.topRight,
                    child: new Text(
                      "A really long text",
                      style: TextStyle(),
                      overflow: TextOverflow.fade,
                      textAlign: TextAlign.right,
                    ),
                  ),
                ],
              ),
            ),
          ),
        ),
        Positioned(
          bottom: 0,
          left: 0,
          child: Container(
            height: 48,
            width: 48,
            decoration: BoxDecoration(
              borderRadius: BorderRadius.circular(12),
              color: Color.fromRGBO(196, 196, 196, 1),
              // color: Colors.white,
            ),
          ),
        )
      ],
    );

我得到的输出是:

我需要这样的输出:

【问题讨论】:

  • 恕我直言,有一组预定义的小部件可用,据我所知,这还不可能。但是,我建议您检查CustomMultiChildLayout 小部件,如post 中详细说明的那样。提出一些可行的模型,然后我们可以尝试解决问题。
  • 还检查RichText 小部件,它允许您在 github 中嵌入具有多个文本跨度的任何小部件及其相关问题,以了解该小部件现在可以做什么和不可以做什么。我在 codepen 中为您提供了一个示例 here。您或其他人也许可以尝试并在此基础上继续发展。

标签: flutter flutter-web


【解决方案1】:

也许这个包可以帮助你drop_cap_text

DropCapText(
loremIpsumText,
style: TextStyle(
    height: 1.3,
    fontFamily: 'times',
),
dropCapChars: 2,
indentation: Offset(25, 10),
),

【讨论】:

  • 这绝对不是我的用例。不过感谢您的回答!
【解决方案2】:

我找到了实现此 UI 的解决方法。我使用了一个Column 小部件并在其中放置了一个Text 小部件和一个Row 小部件。长文本分为两个独立的Text 小部件。一个在Row 小部件上方,另一个在Row 小部件内部。

Row 小部件内部,有一个透明的Container,它为我们提供了Text 的包装,整个小部件都在Stack 小部件内部。

这真的很难用语言来解释,所以这是我的实现:

class MyWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(
        child: Center(
          child: Stack(
            overflow: Overflow.visible,
            children: [
              Card(
                elevation: 4,
                shadowColor: Colors.black45,
                margin: const EdgeInsets.symmetric(horizontal: 20),
                shape: RoundedRectangleBorder(
                  borderRadius: BorderRadius.circular(30),
                ),
                child: Container(
                  padding: const EdgeInsets.all(20),
                  color: Colors.white,
                  child: Column(
                    mainAxisSize: MainAxisSize.min,
                    mainAxisAlignment: MainAxisAlignment.end,
                    children: [
                      const Text(
                        'we pay close attention to every detail',
                        style: const TextStyle(
                          color: Colors.black,
                          fontWeight: FontWeight.bold,
                          fontSize: 30,
                        ),
                        textAlign: TextAlign.end,
                      ),
                      const Text(
                        'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et.',
                        textAlign: TextAlign.end,
                        style: TextStyle(
                          color: Colors.black54,
                          fontSize: 18,
                          fontStyle: FontStyle.italic,
                        ),
                      ),
                      Row(
                        crossAxisAlignment: CrossAxisAlignment.start,
                        children: [
                          // Hidden Widget to force text wrapping
                          Container(
                            decoration: BoxDecoration(
                              borderRadius: BorderRadius.circular(16),
                              color: Colors.transparent,
                            ),
                            height: 60,
                            width: 60,
                            margin: const EdgeInsets.only(top: 8, right: 6),
                          ),
                          Expanded(
                            child: const Text(
                              'Lorem ipsum dolor sit amet, elit, sed dolor eiusm tempor incid ut labore et dolorend magnaber aliqua.  adipis elit, sed do eius tepor incid ut labore et dolore magna aliqua.',
                              textAlign: TextAlign.end,
                              overflow: TextOverflow.fade,
                              style: TextStyle(
                                color: Colors.black54,
                                fontSize: 18,
                                fontStyle: FontStyle.italic,
                              ),
                              maxLines: 4,
                            ),
                          ),
                        ],
                      ),
                    ],
                  ),
                ),
              ),
              Positioned(
                left: 16,
                bottom: -16,
                child: Container(
                  decoration: BoxDecoration(
                    borderRadius: BorderRadius.circular(16),
                    color: Colors.grey,
                  ),
                  height: 80,
                  width: 80,
                  margin: const EdgeInsets.only(top: 8, right: 6),
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

【讨论】:

  • 谢谢...但我想到了这一点。但是您会看到,由于小部件将是响应式的并且文本将是动态的,因此这将有些困难。我总是可以为某些特定数量的字符计算宽度和子字符串并以这种方式显示。我将再等 5 天并接受这个答案。
猜你喜欢
  • 1970-01-01
  • 2017-06-10
  • 2016-06-16
  • 1970-01-01
  • 2023-04-07
  • 2011-07-06
  • 1970-01-01
  • 1970-01-01
  • 2015-05-09
相关资源
最近更新 更多