DefaultTextStyle

用于给没有显式设置样式的文本组件添加默认样式

import 'package:flutter/material.dart';

/// Flutter code sample for [DefaultTextStyle].

void main() => runApp(const DefaultTextStyleApp());

class DefaultTextStyleApp extends StatelessWidget {
  const DefaultTextStyleApp({super.key});

  
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(brightness: Brightness.light, colorSchemeSeed: Colors.purple),
      home: const DefaultTextStyleExample(),
    );
  }
}

class DefaultTextStyleExample extends StatelessWidget {
  const DefaultTextStyleExample({super.key});

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('DefaultTextStyle.merge Sample')),
      // Inherit MaterialApp text theme and override font size and font weight.
      body: DefaultTextStyle.merge(
        style: const TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
        child: const Center(child: Text('Flutter')),
      ),
    );
  }
}

构造函数

//给子组件树添加默认文本样式
DefaultTextStyle.new({
  Key? key, 
  required TextStyle style, 
  TextAlign? textAlign, 
  bool softWrap = true, 
  TextOverflow overflow = TextOverflow.clip, 
  int? maxLines, 
  TextWidthBasis textWidthBasis = TextWidthBasis.parent, 
  TextHeightBehavior? textHeightBehavior, 
  required Widget child
})

//一个可构造的常量默认文本样式,提供回退值
DefaultTextStyle.fallback({Key? key})

参数

参数参数类型说明
childWidget子组件
maxLinesint?最大行数
overflowTextOverflow文本溢出样式设置
softWrapbool设置文本是否在合适的位置进行换行
styleTextStyle文本样式
textAlignTextAlign?文本对齐方式
textHeightBehaviorTextHeightBehavior?微调行高计算规则,设置第一行或者最后一行的行空白处要不要参与整体高度计算
textWidthBasisTextWidthBasis用于告诉渲染引擎文本宽度是按照文本最长的一行,还是父布局给的约束宽度

方法

方法名方法类型说明
updateShouldNotify(convariant DefaultTextStyle oldWidget) -> bool一个回调函数用于控制子树是否需要因为变化而重新构建

DefaultTextStyle的默认实现是:


bool updateShouldNotify(DefaultTextStyle oldWidget) {
  return style != oldWidget.style ||
         textAlign != oldWidget.textAlign ||
         softWrap != oldWidget.softWrap ||
         overflow != oldWidget.overflow ||
         maxLines != oldWidget.maxLines;
}

也就是只要样式或相关属性发生变化,就会通知子树重建。可以通过重写这个方法来控制何时应该通知子树更新


bool updateShouldNotify(MyDefaultTextStyle oldWidget) {
  // 只在字体大小变化时才通知
  return style.fontSize != oldWidget.style.fontSize;
}

静态方法

创建一个默认的文本样式,该样式将覆盖在当前Widget树中此点作用域内的文本样式

merge({
  Key? key, 
  TextStyle? style, 
  TextAlign? textAlign, 
  bool? softWrap, 
  TextOverflow? overflow, 
  int? maxLines, 
  TextWidthBasis? textWidthBasis, 
  TextHeightBehavior? textHeightBehavior, 
  required Widget child
}) -> Widget

根据传入的context返回组件树最靠近的DefaultTextStyle的实例

of(BuildContext context) -> DefaultTextStyle