You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
aku_new_community/lib/widget/expandable_text.dart

86 lines
2.5 KiB

// Flutter imports:
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
//TODO Please remove those sh*t code.
class ExpandableText extends StatefulWidget {
final String text;
final int maxLines;
final TextStyle style;
bool expand;
ExpandableText({Key key, this.text, this.maxLines, this.style, this.expand})
: super(key: key);
@override
_ExpandableTextState createState() => _ExpandableTextState();
}
class _ExpandableTextState extends State<ExpandableText> {
@override
void initState() {
super.initState();
if (widget.expand == null) {
setState(() {
widget.expand = false;
});
}
}
@override
Widget build(BuildContext context) {
return Container(
child: LayoutBuilder(
builder: (BuildContext context, size) {
final span = TextSpan(text: widget.text ?? '', style: widget.style);
final tp = TextPainter(
text: span,
maxLines: widget.maxLines,
textDirection: TextDirection.ltr,
);
tp.layout(maxWidth: size.maxWidth);
if (tp.didExceedMaxLines) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
widget.expand
? Text(
widget.text ?? '',
style: widget.style,
)
: Text(
widget.text ?? '',
maxLines: widget.maxLines,
overflow: TextOverflow.ellipsis,
style: widget.style,
),
GestureDetector(
behavior: HitTestBehavior.translucent,
onTap: () {
setState(() {
widget.expand = !widget.expand;
});
},
child: Container(
padding: EdgeInsets.only(top: 2),
child: Text(
widget.expand ? '收起' : '全文',
style: TextStyle(
fontSize: widget.style != null
? widget.style.fontSize
: null,
color: Color(0xffffc40c)),
),
),
)
],
);
} else {
return Text(widget.text ?? '', style: widget.style);
}
},
),
);
}
}