gpt4 book ai didi

dart - 如何检查 Flutter Text 小部件是否溢出

转载 作者:IT老高 更新时间:2023-10-28 12:34:22 28 4
gpt4 key购买 nike

我有一个文本小部件,如果它超过一定大小,可以截断:

ConstrainedBox(
constraints: BoxConstraints(maxHeight: 50.0),
child: Text(
widget.review,
overflow: TextOverflow.ellipsis,
)
);

或最大行数:

RichText(
maxLines: 2,
overflow: TextOverflow.ellipsis,
text: TextSpan(
style: TextStyle(color: Colors.black),
text: widget.review,
));

我的目标是让文本只有在发生溢出时才可展开。是否有适当的方法检查文本是否溢出?

我尝试过的

我发现在 RichText 中,有一个 RenderParagraph renderObject ,它有一个私有(private)属性 TextPainter _textPainter 有一个 bool didExceedMaxLines

简而言之,我只需要访问 richText.renderObject._textPainter.didExceedMaxLines 但正如您所见,它是私有(private)的,带有下划线。

最佳答案

我找到了一种方法。完整代码如下,简而言之:

  1. 使用 LayoutBuilder 来确定我们有多少空间。
  2. 使用 TextPainter 模拟空间内文本的渲染。

这是完整的演示应用:

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Text Overflow Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: Scaffold(
appBar: AppBar(title: Text("DEMO")),
body: TextOverflowDemo(),
),
);
}
}

class TextOverflowDemo extends StatefulWidget {
@override
_EditorState createState() => _EditorState();
}

class _EditorState extends State<TextOverflowDemo> {
var controller = TextEditingController();

@override
void initState() {
controller.addListener(() {
setState(() {
mytext = controller.text;
});
});
controller.text = "This is a long overflowing text!!!";
super.initState();
}

@override
void dispose() {
controller.dispose();
super.dispose();
}

String mytext = "";

@override
Widget build(BuildContext context) {
int maxLines = 1;
double fontSize = 30.0;

return Padding(
padding: const EdgeInsets.all(12.0),
child: Column(
children: <Widget>[
LayoutBuilder(builder: (context, size) {
// Build the textspan
var span = TextSpan(
text: mytext,
style: TextStyle(fontSize: fontSize),
);

// Use a textpainter to determine if it will exceed max lines
var tp = TextPainter(
maxLines: maxLines,
textAlign: TextAlign.left,
textDirection: TextDirection.ltr,
text: span,
);

// trigger it to layout
tp.layout(maxWidth: size.maxWidth);

// whether the text overflowed or not
var exceeded = tp.didExceedMaxLines;

return Column(children: <Widget>[
Text.rich(
span,
overflow: TextOverflow.ellipsis,
maxLines: maxLines,
),
Text(exceeded ? "Overflowed!" : "Not overflowed yet.")
]);
}),
TextField(
controller: controller,
),
],
),
);
}
}

关于dart - 如何检查 Flutter Text 小部件是否溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51114778/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com