Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 多行文本组件颤振_Flutter_Dart_Flutter Text_Flutter Design - Fatal编程技术网

Flutter 多行文本组件颤振

Flutter 多行文本组件颤振,flutter,dart,flutter-text,flutter-design,Flutter,Dart,Flutter Text,Flutter Design,我创建了一个可重用的多行文本组件。我正在使用TextSpan小部件 代码: ///创建多行样式的小部件,该小部件使用项目符号显示项目列表 类AppMultiLineText扩展了无状态小部件{ 最后清单项目; 最后一个字符串SemanticText; const-appmultilitext({@required this.items,this.semanticsText}):断言(items!=null); @凌驾 小部件构建(构建上下文){ 最终样式=context.appmotedata.

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

代码:

///创建多行样式的小部件,该小部件使用项目符号显示项目列表
类AppMultiLineText扩展了无状态小部件{
最后清单项目;
最后一个字符串SemanticText;
const-appmultilitext({@required this.items,this.semanticsText}):断言(items!=null);
@凌驾
小部件构建(构建上下文){
最终样式=context.appmotedata.bodyCopyDefault.appTextStyle;
final styleBold=context.appmotedata.bodyCopyBold.appTextStyle;
返回合并语义(
孩子:填充(
填充:context.appThemeData.multiliedisplay.padding,
子:列(
儿童:[
_buildRow(上下文、项、样式、样式粗体、语义文本),
],
),
),
);
}
}
Widget\u buildRow(BuildContext上下文、列表样式文本、AppTextStyle样式、AppTextStyleBold、,
字符串(语义文本){
final _padding=EdgeInsets.symmetric(垂直:context.appmedata.bulletStyle.spaceBetweenLines);
返回语义(
孩子:填充(
填充:_填充,
孩子:排(
儿童:[
_第二节(上下文),
_styledWidget(上下文、styledText、style、styleBold、SemanticText),
],
),
),
);
}
Widget\u buildBulletSection(BuildContext上下文){
//final textScaleFactor=_textScaleFactor(上下文);
最终_bulletPadding=仅限边缘设置(
顶部:context.appmotedata.bulletStyle.bulletOffset,右侧:context.appmotedata.bulletStyle.spaceAfterBullet);
返回Text.rich(
TextSpan(
儿童:[
WidgetSpan(
孩子:填充(
填充:_bulletPadding,
子项:_drawBullet(上下文),
),
),
],
),
//textScaleFactor:textScaleFactor,
);
}
小部件\u drawBullet(构建上下文){
最终_bulletDiameter=context.appmotedata.bulletStyle.bulletDiameter;
返回容器(
宽度:直径,
高度:_直径,
装饰:盒子装饰(
颜色:context.appmotedata.bodyCopyDefault.appTextStyle.textStyle.color,
形状:BoxShape.circle,
),
);
}
Widget_styledWidget(BuildContext上下文、List styledText、AppTextStyle样式、,
AppTextStyle样式(粗体,字符串语义文本){
最终scaleFactor=context.calculateScaleFactor(
style.textStyle.fontSize,
style.maximumFontSize,
style.minimumScalingFactor,
);
扩大回报(
孩子:Text.rich(
TextSpan(
style:style.textStyle,
子类:styledText.map((e){
返回文本范围(
文本:e.text,
款式:e.isBold
?styleBold.textStyle.copyWith(
字母间距:e.isNumeric?PresentationConstants.NumericletSpacing:null,
)
:style.textStyle.copyWith(
字母间距:e.isNumeric?PresentationConstants.NumericletSpacing:null,
),
);
}).toList(),
),
style:style.textStyle,
textScaleFactor:scaleFactor,
textAlign:style.textAlign,
semanticsLabel:semanticsText,
),
);
}
类CustomStyledText{
最终字符串文本;
最终字符串样式文本;
最后的布尔是黑体;
最终布尔值为数字;
自定义样式文本(
这个文本{
这个.styleText,
this.isBold=false,
this.isNumeric=false,
});
}
类别:
appmultilitext(
项目:[
CustomStyledText(context.appLocalization.listOfRequirementsBodyCopy1),
CustomStyledText(context.appLocalization.listOfRequirementsBodyCopy2),
],
),
],
),
[![在此处输入图像描述][1][1]

这是预期的设计 [1] :


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

最好使用RichText小部件。有详细信息

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

导入“包装:颤振/材料.省道”;
类CustomList扩展了无状态小部件{
最后儿童名单;
常量自定义列表({
关键点,
this.children=const[],
}):super(key:key);
@凌驾
小部件构建(构建上下文){
返回列(
儿童:[
for(儿童中的最后一个儿童)
容器(
填充:所有边缘设置(10.0),
孩子:排(
crossAxisAlignment:crossAxisAlignment.start,
儿童:[
填充物(
填充:常数边集全部(5.0),
子:图标(
图标。圆圈,
尺寸:4.0,
),
),
尺寸箱(宽度:10.0),
扩展(子:子),
],
),
),
],
);
}
}
将您喜欢的任何小部件传递给它的子部件,它将自动附加点:

CustomList(
儿童:[
文本(“我的第一行文本”),
正文(
“我的第二行文字已经够长了,够长了,够长了,够长了,够长了,够长了”,
样式:TextStyle(
fontWeight:fontWeight.bold,
颜色:颜色。橙色,
字体大小:20.0,
),
),
],
),
-----------插件-----------

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

导入“包装:颤振/材料.省道”;
枚举CustomListType{无序,有序}
类CustomList扩展了无状态小部件{
最后儿童名单;
最终自定义列表类型;
常量自定义列表({
关键点,
this.children=const[],
this.type=CustomListType.Unordered,
}):super(key:key);
@凌驾
小部件构建(构建上下文){
最终_子项=[];
F
/// 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, style, styleBold, semanticsText),
          
        ],
      ),
    ),
  );
}

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, List<CustomStyledText> styledText, AppTextStyle style,
    AppTextStyle styleBold, 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),
                
              ],
            ),
          ],
        ),