微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

多行文本组件颤动

如何解决多行文本组件颤动

我创建了一个可重复使用的多行文本组件。我正在使用 TextSpan 小部件。

代码

/// Creates multi line styled widget which displays list of items with bullet
class AppMultiLineText extends StatelessWidget {
  final List<CustomStyledText> items;
  final String semanticsText;

  const AppMultiLineText({@required this.items,this.semanticsText}) : assert(items != null);

  @override
  Widget build(BuildContext context) {
    final style = context.appThemeData.bodycopyDefault.appTextStyle;
    final styleBold = context.appThemeData.bodycopyBold.appTextStyle;
    return MergeSemantics(
      child: Padding(
        padding: context.appThemeData.multilinedisplay.padding,child: Column(
          children: [
            _buildrow(context,items,style,styleBold,semanticsText),],),);
  }
}

Widget _buildrow(BuildContext context,List<CustomStyledText> styledText,AppTextStyle style,AppTextStyle styleBold,String semanticsText) {
  final _padding = EdgeInsets.symmetric(vertical: context.appThemeData.bulletStyle.spaceBetweenLines);
  return Semantics(
    child: Padding(
      padding: _padding,child: Row(
        children: [
          _buildBulletSection(context),_styledWidget(context,styledText,);
}

Widget _buildBulletSection(BuildContext context) {
  // final textScaleFactor = _textScaleFactor(context);
  final _bulletPadding = EdgeInsets.only(
      top: context.appThemeData.bulletStyle.bulletoffset,right: context.appThemeData.bulletStyle.spaceAfterBullet);

  return Text.rich(
    TextSpan(
      children: [
        WidgetSpan(
          child: Padding(
            padding: _bulletPadding,child: _drawBullet(context),//textScaleFactor: textScaleFactor,);
}

Widget _drawBullet(BuildContext context) {
  final _bulletDiameter = context.appThemeData.bulletStyle.bulletDiameter;
  return Container(
    width: _bulletDiameter,height: _bulletDiameter,decoration: Boxdecoration(
      color: context.appThemeData.bodycopyDefault.appTextStyle.textStyle.color,shape: BoxShape.circle,);
}
Widget _styledWidget(BuildContext context,String semanticsText) {
  final scaleFactor = context.calculateScaleFactor(
    style.textStyle.fontSize,style.maximumFontSize,style.minimumScalingFactor,);

  return Expanded(
    child: Text.rich(
      TextSpan(
        style: style.textStyle,children: styledText.map((e) {
          return TextSpan(
            text: e.text,style: e.isBold
                ? styleBold.textStyle.copyWith(
                    letterSpacing: e.isNumeric ? PresentationConstants.numericLetterSpacing : null,)
                : style.textStyle.copyWith(
                    letterSpacing: e.isNumeric ? PresentationConstants.numericLetterSpacing : null,);
        }).toList(),style: style.textStyle,textScaleFactor: scaleFactor,textAlign: style.textAlign,semanticslabel: semanticsText,);
}

class CustomStyledText {
  final String text;
  final String styleText;
  final bool isBold;
  final bool isNumeric;

  CustomStyledText(
    this.text,{
    this.styleText,this.isBold = false,this.isNumeric = false,});
}


class:
 AppMultiLineText(
              items: [
                CustomStyledText(context.appLocalization.listofRequirementsBodycopy1),CustomStyledText(context.appLocalization.listofRequirementsBodycopy2),

[![在此处输入图片描述][1]][1]

这是预期的设计 [1]:https://i.stack.imgur.com/AZF3w.png

但我将所有项目都作为段落。

解决方法

最好使用 RichText 小部件。详情请见here

,

我可以提出另一个解决方案吗?

import 'package:flutter/material.dart';

class CustomList extends StatelessWidget {
  final List<Widget> children;

  const CustomList({
    Key key,this.children = const [],}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        for (final child in children)
          Container(
            padding: EdgeInsets.all(10.0),child: Row(
              crossAxisAlignment: CrossAxisAlignment.start,children: [
                Padding(
                  padding: const EdgeInsets.all(5.0),child: Icon(
                    Icons.circle,size: 4.0,),SizedBox(width: 10.0),Expanded(child: child),],);
  }
}

将您喜欢的任何小部件传递给它的子部件,它会自动附加点:

CustomList(
            children: [
              Text('My first line of text'),Text(
                'My second line of text which is long enough,long enough,long enough',style: TextStyle(
                  fontWeight: FontWeight.bold,color: Colors.orange,fontSize: 20.0,

-----------插件 -----------

您可以更进一步,添加“类型”以从无序样式切换到有序样式。

import 'package:flutter/material.dart';

enum CustomListType { Unordered,Ordered }

class CustomList extends StatelessWidget {
  final List<Widget> children;
  final CustomListType type;

  const CustomList({
    Key key,this.type = CustomListType.Unordered,}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    final _children = <Widget>[];
    for (var i = 0; i < children.length; i++) {
      _children.add(Container(
        padding: EdgeInsets.all(10.0),child: Row(
          crossAxisAlignment: CrossAxisAlignment.start,children: [
            type == CustomListType.Ordered
                ? Text('${i + 1}.')
                : Padding(
                    padding: const EdgeInsets.all(5.0),child: Icon(
                      Icons.circle,Expanded(child: children.elementAt(i)),));
    }
    return Column(
      children: _children,);
  }
}
CustomList(
            type: CustomListType.Ordered,children: [
              Text('My first line of text'),

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?