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

news/2024/11/15 6:06:45/文章来源:https://www.cnblogs.com/ayubene/p/18300607

《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.@overrideWidget 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');// }@overrideWidget 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 {@overrideWidget 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 {@overrideWidget 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.@overrideWidget 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');// }@overrideWidget 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 {@overrideWidget 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 {@overrideWidget 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 {@overrideWidget 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: truefonts:- family: Ralewayfonts:- asset: lib/assets/fonts/Raleway/Raleway-LightItalic.ttfweight: 300style: italic- family: MiaoZifonts:- 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,),

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/743432.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Invicti v24.7.0 for Windows - Web 应用程序安全测试

Invicti v24.7.0 for Windows - Web 应用程序安全测试Invicti v24.7.0 for Windows - Web 应用程序安全测试 Invicti Standard v24.7.0 - 9 July 2024 请访问原文链接:https://sysin.org/blog/invicti/,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.orgInvicti 是…

Nexpose v6.6.260 for Linux Windows - 漏洞扫描

Nexpose v6.6.260 for Linux & Windows - 漏洞扫描Nexpose v6.6.260 for Linux & Windows - 漏洞扫描 Rapid7 Vulnerability Management, release Jul 10, 2024 请访问原文链接:https://sysin.org/blog/nexpose-6/,查看最新版。原创作品,转载请保留出处。 作者主页:…

ABC 362

ABC 362比赛链接\[Solution \]题目链接 提交记录模拟。

Jmeter 引入自己写的jar包代码

一、编译调试Java代码在编程工具中将代码进行调试,满足需求后将代码进行打包导出成 .jar 文件,根据不同的编译工具搜索导出功能即可示例代码一:package com.dffl.gyl;public class Jmeter_test {public static String meter_test() {System.out.println("写点东西2"…

0180-进入 64 位模式

环境Time 2022-11-12 WSL-Ubuntu 22.04 QEMU 6.2.0 NASM 2.15.05前言 说明 参考:https://os.phil-opp.com/entering-longmode 目标 从保护模式切换到长模式。 定位代码段 因为当前还是执行的 32 的指令,所以需要执行跳转,重新选择 GDT,这里给代码段加了一个标记。 gdt64:dq…

0178-开启四级分页

环境Time 2022-11-12 WSL-Ubuntu 22.04 QEMU 6.2.0 NASM 2.15.05前言 说明 参考:https://os.phil-opp.com/entering-longmode 目标 如果要进入长模式,则必须要进行分页。在 64 位系统中,采用 4 级分页。 关于分页的信息,需要找其它的资料另外了解,这里不做详细介绍。 介绍…

『比赛记录』【LGR-193】洛谷 7 月月赛 IABC 362

『比赛记录』【LGR-193】洛谷 7 月月赛 IABC 362最舒服的一集「CROI R2」在相思树下 I 想了好久还是决定把这道题也写一下,毕竟赛事花了 \(40min\) 才解决。 思路 开比赛,看题面,很快啊,打了一个双端队列的做法,结果 MLE,然后人傻了二十分钟。 之后缓过神来开始推式子。…

[DP] 数位DP

本文主要内容:数位DP例题数位DP 主要有两种方法,填数法和记搜。这里主要研究记搜的实现; 模板 相比于填数法,记搜的优点在于有固定的模板,实现较容易; 缺点在于需要很多 $ memset $,常数较大,容易被卡; 下面通过几道例题来了解记搜模板; 一 $ haha $ 数设记搜各参数如…

数据库的触发器的使用

需要实现在passenger中添加乘客信息后,在classes(班次)中对应舱位的已售出票数+1例:在passenger中添加了一个degree=“头等舱”的乘客,就在classes中对应头等舱已售出票数goodnumber+1 (经济舱类似,对应secondnumber+1实现方法: 在passenger表中增加触发器,在新增pa…

【比赛】CSP提高组模拟1

挂的分比我打的都多和初三学长们一起打的比赛,被人家爆杀了。 T1 最短路 20Pts 原题 Cow Toll Paths G。 正解是按点权排序后跑一遍 Floyd,歪解是多迭代几遍。 赛时没开 long long \(80 \to 20\)。点击查看代码 #include<bits/stdc++.h> #define int ll using namespa…

トヨタ自動車プログラミングコンテスト2024#7(ABC 362)

非常好名次,使我的 \(1\) 旋转 四发罚时应该是这次比赛最唐的东西了,没有就进前一千了 A.Buy a Pen 特判秒了,懒得打三种 ans=,所以就把不能选的那个赋值成无穷大了 #include<bits/stdc++.h> using namespace std; #define speed ios::sync_with_stdio(false); #defi…