首页 > 其他分享 >前端学习-flutter学习-009-文本及样式

前端学习-flutter学习-009-文本及样式

时间:2024-07-14 10:40:45浏览次数:17  
标签:TipRoute const Text 学习 context text 009 flutter 路由

《Flutter实战·第二版》

Text

  • TextAlign:left right center 注意点:对齐的参考系是Text widget 本身,如果文本不够长,设置看起来是没有生效的;文本长才看得到,字符串内容超过一行,Text 宽度等于屏幕宽度,第二行文本便会居中显示。
  • maxLines、overflow:指定文本显示的最大行数,默认情况下,文本是自动折行的,如果指定此参数,则文本最多不会超过指定的行。此处截断方式TextOverflow.ellipsis,它会将多余文本截断后以省略符“...”表示;
  • textScaler:字体大小,TextScaler.linear(1.5);TextScaler.noScaling则是:禁止部分文本随系统字体大小缩放
const Text("Hello worldaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
   textAlign: TextAlign.right,
),
Text("Hello world! I'm Jack. "*4,
  maxLines: 1,
  overflow: TextOverflow.ellipsis,
),
const Text("Hello world",
  // textScaler: TextScaler.noScaling,
  textScaler: TextScaler.linear(1.5),
),

import 'package:flutter/material.dart';
import 'package:english_words/english_words.dart';

// import 'package:flutter/cupertino.dart';
// void main() {
//   runApp(const MyApp());
// }

import 'dart:async' show Future;
import 'package:flutter/services.dart' show rootBundle;



void main() => runApp(const MyApp());
// void main() => runApp(CupertinoApp(home: CupertinoTestRoute()));

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

  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      initialRoute:"/", //名为"/"的路由作为应用的home(首页)
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.blue),
        useMaterial3: true,
      ),
      routes:{
        "new_page":(context) => TipRoute(text:'这个参数是配置路由传过来的'),
        "/":(context) => RouterTestRoute(), //注册首页路由
      },
    );
  }
}

class TipRoute extends StatelessWidget {
  TipRoute({
    Key? key,
    required this.text,  // 接收一个text参数
  }) : super(key: key);
  final String text;

  // Future<String> loadAsset() async {
  //   return await rootBundle.loadString('assets/my_icon.png');
  // }
  @override
  Widget build(BuildContext context) {
    //获取路由参数
    var args=ModalRoute.of(context)?.settings.arguments;
    print('旧页面传递参数的方法2:arguments:$args');
    return Scaffold(
      appBar: AppBar(
        title: Text("提示"),
      ),
      body: Padding(
        padding: EdgeInsets.all(18),
        child: Center(
          child: Column(
            children: <Widget>[
              Text(text),
              ElevatedButton(
                onPressed: () => Navigator.pop(context, "这个数据是新页面传递给旧页面的"),
                child: Text("返回"),
              ),
              // AssetImage(loadAsset())
              // Image.asset('assets/my_icon.png'),
            ],
          ),
        ),
      ),
    );
  }
}


// flutter run -d chrome --web-renderer canvaskit
class RouterTestRoute extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("初始页面"),
      ),
      body: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            ElevatedButton(
              onPressed: () async {
                // 打开`TipRoute`,并等待返回结果
                // var result = await Navigator.push(
                //   context,
                //   MaterialPageRoute(
                //     builder: (context) {
                //       return TipRoute(
                //         // 路由参数
                //         text: "这个数据是旧页面传递给新页面的",
                //       );
                //     },
                //   ),
                // );
                var result = await Navigator.pushNamed(context, "new_page",  arguments: "hi");
                //输出`TipRoute`路由返回结果
                print("路由返回值: $result");
              },
              child: Text("打开提示页"),
            ),
            RandomWordsWidget(),
            const Text("Hello world",
               textAlign: TextAlign.right,
            ),
            Text("Hello world! I'm Jack. "*4,
              maxLines: 1,
              overflow: TextOverflow.ellipsis,
            ),
            const Text("Hello world",
              // textScaler: TextScaler.noScaling,
              textScaler: TextScaler.linear(1.5),
            ),
          ],
        ),
    );


  }
}

class RandomWordsWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // 生成随机字符串
    final wordPair = WordPair.random();
    return Padding(
      padding: const EdgeInsets.all(8.0),
      child: Text('这是随机的英文字符串:' + wordPair.toString()),
    );
  }
}

TextStyle

  • height:该属性用于指定行高,但它并不是一个绝对值,而是一个因子,具体的行高等于fontSize*height。
  • fontFamily :由于不同平台默认支持的字体集不同,所以在手动指定字体时一定要先在不同平台测试一下。
  • fontSize:该属性和 Text 的textScaler都用于控制字体大小。但是有两个主要区别:
    • fontSize可以精确指定字体大小,而textScaler只能通过缩放比例来控制。
    • textScaler主要是用于系统字体大小设置改变时对 Flutter 应用字体进行全局调整,而fontSize通常用于单个文本,字体大小不会跟随系统字体大小变化
import 'package:flutter/material.dart';
import 'package:english_words/english_words.dart';

// import 'package:flutter/cupertino.dart';
// void main() {
//   runApp(const MyApp());
// }

import 'dart:async' show Future;
import 'package:flutter/services.dart' show rootBundle;



void main() => runApp(const MyApp());
// void main() => runApp(CupertinoApp(home: CupertinoTestRoute()));

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

  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      initialRoute:"/", //名为"/"的路由作为应用的home(首页)
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.blue),
        useMaterial3: true,
      ),
      routes:{
        "new_page":(context) => TipRoute(text:'这个参数是配置路由传过来的'),
        "/":(context) => RouterTestRoute(), //注册首页路由
      },
    );
  }
}

class TipRoute extends StatelessWidget {
  TipRoute({
    Key? key,
    required this.text,  // 接收一个text参数
  }) : super(key: key);
  final String text;

  // Future<String> loadAsset() async {
  //   return await rootBundle.loadString('assets/my_icon.png');
  // }
  @override
  Widget build(BuildContext context) {
    //获取路由参数
    var args=ModalRoute.of(context)?.settings.arguments;
    print('旧页面传递参数的方法2:arguments:$args');
    return Scaffold(
      appBar: AppBar(
        title: Text("提示"),
      ),
      body: Padding(
        padding: EdgeInsets.all(18),
        child: Center(
          child: Column(
            children: <Widget>[
              Text(text),
              ElevatedButton(
                onPressed: () => Navigator.pop(context, "这个数据是新页面传递给旧页面的"),
                child: Text("返回"),
              ),
              // AssetImage(loadAsset())
              // Image.asset('assets/my_icon.png'),
            ],
          ),
        ),
      ),
    );
  }
}


// flutter run -d chrome --web-renderer canvaskit
class RouterTestRoute extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("初始页面"),
      ),
      body: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            ElevatedButton(
              onPressed: () async {
                // 打开`TipRoute`,并等待返回结果
                // var result = await Navigator.push(
                //   context,
                //   MaterialPageRoute(
                //     builder: (context) {
                //       return TipRoute(
                //         // 路由参数
                //         text: "这个数据是旧页面传递给新页面的",
                //       );
                //     },
                //   ),
                // );
                var result = await Navigator.pushNamed(context, "new_page",  arguments: "hi");
                //输出`TipRoute`路由返回结果
                print("路由返回值: $result");
              },
              child: Text("打开提示页"),
            ),
            RandomWordsWidget(),
            Text("Hello worldaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
               textAlign: TextAlign.right,
                style: TextStyle(
                    color: Colors.blue,
                    fontSize: 18.0,
                    height: 1.2,
                    fontFamily: "Courier",
                    background: Paint()..color=Colors.yellow,
                    decoration:TextDecoration.underline,
                    decorationStyle: TextDecorationStyle.dashed
                ),
            ),
            // Text("Hello world! I'm Jack. "*4,
            //   maxLines: 1,
            //   overflow: TextOverflow.ellipsis,
            // ),
            // const Text("Hello world",
            //   // textScaler: TextScaler.noScaling,
            //   textScaler: TextScaler.linear(1.5),
            // ),
          ],
        ),
    );


  }
}

class RandomWordsWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // 生成随机字符串
    final wordPair = WordPair.random();
    return Padding(
      padding: const EdgeInsets.all(8.0),
      child: Text('这是随机的英文字符串:' + wordPair.toString()),
    );
  }
}

TextSpan

通过 TextSpan 实现了一个基础文本片段和一个链接片段,然后通过Text.rich 方法将TextSpan 添加到 Text 中, Text 其实就是 RichText 的一个包装,而RichText 是可以显示多种样式(富文本)的 widget。

Text.rich(TextSpan(
  children: [
    TextSpan(
      text: 'home:'
    ),
    TextSpan(
      text: 'https://aaa.bbb.com',
      style: TextStyle(
        color: Colors.blue,
        fontSize: 20,
      ),
        // recognizer: _tapRecognizer
    )
  ]
))

DefaultTextStyle

如果使用DefaultTextStyle在 Widget 树的某一个节点处设置一个默认的文本样式,那么该节点的子树中所有文本都会默认使用这个样式,不使用的话要inherit: false;不过我试了只要子树设置了style 不写inherit: false也没事

class RouterTestRoute extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("初始页面"),
      ),
      body: DefaultTextStyle(
        style: const TextStyle(
          color:Colors.red,
          fontSize: 20.0,
        ),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            ElevatedButton(
              onPressed: () async {
                // 打开`TipRoute`,并等待返回结果
                // var result = await Navigator.push(
                //   context,
                //   MaterialPageRoute(
                //     builder: (context) {
                //       return TipRoute(
                //         // 路由参数
                //         text: "这个数据是旧页面传递给新页面的",
                //       );
                //     },
                //   ),
                // );
                var result = await Navigator.pushNamed(context, "new_page",  arguments: "hi");
                //输出`TipRoute`路由返回结果
                print("路由返回值: $result");
              },
              child: Text("打开提示页"),
            ),
            RandomWordsWidget(),
            Text("Hello worldaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
              textAlign: TextAlign.right,
              // style: TextStyle(
              //     color: Colors.blue,
              //     fontSize: 18.0,
              //     height: 1.2,
              //     fontFamily: "Courier",
              //     background: Paint()..color=Colors.yellow,
              //     decoration:TextDecoration.underline,
              //     decorationStyle: TextDecorationStyle.dashed
              // ),
            ),
            Text('这句话不继承默认样式',
              style: TextStyle(
                inherit: false,
                color: Colors.green,
                fontSize: 20,
              ),
            )
            // Text.rich(TextSpan(
            //     children: [
            //       TextSpan(
            //           text: 'home:'
            //       ),
            //       TextSpan(
            //         text: 'https://aaa.bbb.com',
            //         style: TextStyle(
            //           color: Colors.blue,
            //           fontSize: 20,
            //         ),
            //         // recognizer: _tapRecognizer
            //       )
            //     ]
            // ))
            // Text("Hello world! I'm Jack. "*4,
            //   maxLines: 1,
            //   overflow: TextOverflow.ellipsis,
            // ),
            // const Text("Hello world",
            //   // textScaler: TextScaler.noScaling,
            //   textScaler: TextScaler.linear(1.5),
            // ),
          ],
        ),
      )
    );


  }
}

字体

可以在 Flutter 应用程序中使用不同的字体
在 Flutter 中使用字体分两步完成。首先在pubspec.yaml中声明它们,以确保它们会打包到应用程序中。然后通过TextStyle (opens new window)属性使用字体。
在pubspec.yaml中声明

flutter:

  # The following line ensures that the Material Icons font is
  # included with your application, so that you can use the icons in
  # the material Icons class.
  uses-material-design: true

  fonts:
    - family: Raleway
      fonts:
        - asset: lib/assets/fonts/Raleway/Raleway-LightItalic.ttf
          weight: 300
          style: italic
    - family: MiaoZi
      fonts:
        - asset: lib/assets/fonts/MiaoZi-YunYingTi-2.ttf

使用:

Text('这句话使用了喵喵字体',
  style: TextStyle(
    inherit: false,
    fontFamily: 'MiaoZi',
    color: Colors.blue,
    fontSize: 30,
    // fontWeight: FontWeight.w300,
    // fontStyle: FontStyle.italic,
  ),

不太会用的话可以看看这个视频

标签:TipRoute,const,Text,学习,context,text,009,flutter,路由
From: https://www.cnblogs.com/ayubene/p/18300607

相关文章

  • 【java深入学习第3章】通过 Spring AOP 完成参数的加解密
    在现代应用中,数据的安全性越来越受到重视。为了保护敏感数据,我们常常需要对数据进行加密和解密。在这篇博客中,我将展示如何使用SpringAOP(面向切面编程)来实现对方法参数的加解密。什么是SpringAOP?SpringAOP是Spring框架中的一个模块,它提供了面向切面编程的功能。AOP允许我们将......
  • 花几千上万学习Java,真没必要!(四)
    1、关系运算符:packagetest.com;publicclassRelationalArithmetic{ /*关系运算符用于比较两个值之间的关系,关系运算符的结果是一个布尔值,即true或false。 Java提供了6种关系运算符: >:大于 <:小于 >=:大于等于 <=:小于等于 ==:等于 !=:不等于*/publicstaticvoi......
  • vue学习day05-watch侦听器(监视器)、Vue生命周期和生命周期的四个阶段、、工程化开发和
    13、watch侦听器(监视器)(1)作用:监视数据变化,执行一些业务逻辑或异步操作(2)语法:1)简写语法——简单数据类型,直接监视①Watch:{数据属性名(newValue,oldValue){一些业务逻辑或异步操作},‘对象·属性名’(newValue,oldValue){一些业务逻辑或异步操作}}②示例:结果:2)完整写法......
  • 旷野之间19 - Nvidia 首席执行官建议不要学习编码
    50年前出现的许多技术都遵循了两种轨迹之一:它们要么发展以跟上现代的步伐,要么消失得无影无踪。一个例子是1938年推出的第一台可编程机械计算机。由于内存限制,它的操作能力有限,而且重量很重,很难想象今天在我们的家中或工作场所放置这样的设备。确实,有许多技术远见者对计算......
  • flutter pub get 的时候:A dependency specification must be a string or a mapping.
    想在pubspec.yaml文件中添加字体:报错了fonts:-family:MiaoZifonts:-asset:assets/fonts/MiaoZi-YunYingTi-2.ttfweight:500看了这篇文章解决了我原来是加在dependencies:flutter:sdk:flutter#新添加的依赖fonts:......
  • 尚硅谷MySQL数据库入门到大牛_宋红康--学习建议
    【MySQL上篇:基础篇】【第1子篇:数据库概述与MySQL安装篇】p01-p11学习建议:零基础同学必看,涉及理解和Windows系统下MySQL安装【第2子篇:SQL之SELECT使用篇】p12-p48学习建议:学习SQL的重点,必须重点掌握,建议课后练习多写【第3子篇:SQL之DDL、DML、DCL使用篇】p49-p73学习建议:学习SQL的......
  • 命名空间学习
    <?php//php四大开发成员常量,函数,类(接口)默认是声明在全局空间中的//优点:全局调用//缺点:不能重复命名//命名空间namespace//functiondemo()//{//}//functiondemo()//{//}//报错classUserController{}classUserModel{}classUserV......
  • AD学习易忘点DAY1
    目录一.AD原理图中元件引脚红色波浪线报错问题二.原理图更新到到PCB三.将立创EDA中的元器件的原理图/封装和3D模型导入AD的库中四.PCB板框绘制、定义板子形状、重新设置原点、放置尺寸标注五.原理图导入pcb出现报错CannotLocateDocument一.AD原理图中元件引脚红色波......
  • 昇思25天学习打卡营第20天|K近邻算法实现红酒聚类
    这节课主要学习使用MindSpore在部分wine数据集上进行KNN实验。目标是了解KNN的基本概念以及如何使用MindSpore进行KNN实验。1.K近邻算法原理介绍1.1K近邻算法(K-Nearest-Neighbor,KNN)是一种用于分类和回归的非参数统计方法,最初由Cover和Hart于1968年提出(Cover等人,196......
  • Java第二周学习总结
    深入Java基础语法本周,我进一步理解Java中的基本数据类型和引用数据类型。学会了如何根据需求选择合适的数据类型。掌握了算术运算符、关系运算符、逻辑运算符以及位运算符的使用,能够编写简单的表达式进行计算和条件判断。并深入学习了if-else、switch-case、for、while、do-whi......