Day06 - Flutter 常用的基础 Widget(上)

简介: Day06 - Flutter 常用的基础 Widget

概述:


  • Text 文本
  • Icon图标及按钮Button组件
  • Image 图片组件
  • TextField 输入框


一、文本 Widget



  • 1.1、Text 文本组件的概述
    文本组件(Text) 负责文本和定义显示样式,常用属性如下表


属性名 类型 默认值 说明
data String 数据为要显示的文本
maxLine int 0 文本显示的最大行数
style TextStyle null 文本样式,可定以文本的字体大小,颜色,粗细等等
textAlign TextAlign TextAlign.center 文本水平方向对齐方式,取值有 center、end、justify、left,right、start、values
textDirection TextDirection TextDirection.ltr 文本书写的方向,默认是从左到右
textScaleFactor double 1.0 字体的缩放系数
textSpan TextSpan null 文本块,TextSpan 里面可以放文本的内容和样式
overflow TextOverflow 文本放不下的益处方式
  • 1.2、基本的 Text 例子,更多的属性我们可以点击 Text 进去看看


Text(
   "秋风用时光的旋律,用桂花的芬芳、苹果的馨香、菊花的灿烂、牵牛花的奔放",
   // 设置样式
   style: TextStyle(
      // 字体的大小
      fontSize: 22,
      // 字体的颜色
      color: Colors.green,
      // 设置下划线
      decoration: TextDecoration.overline,
      // 设置下划线的颜色
      decorationColor: Colors.red
      // 字体倾斜
      fontStyle: FontStyle.italic,
      // 字体加粗
      fontWeight: FontWeight.bold
   ),
   // 设置对齐方式
   textAlign: TextAlign.center,
   // 设置方向
   textDirection: TextDirection.rtl,
   // 设置缩放系数
   textScaleFactor: 1.0,
   // 最大行数
   maxLines: 2,
   // 超出显示 ...
   overflow: TextOverflow.ellipsis,
);
  • 1.3、Text.Rich富文本


Text.rich(
   TextSpan(
      children: [
         TextSpan(text: "Hello World", style: TextStyle(color: Colors.green)),
         TextSpan(text: "Hello Flutter", style: TextStyle(color: Colors.brown)),
         WidgetSpan(child: Icon(Icons.favorite, color: Colors.red,)),
         TextSpan(text: "Hello 北京", style: TextStyle(color: Colors.black)),
      ]
   )
);


二、图标及按钮组件



  • 2.1、图标组件图标组件(Icon) 为展示图标的组件,该组件不可交互,要实现可交互的图标,可以考虑使用 IconButton 组件。 图标组件 相关的组件有以下几个:
  • IconButton: 可交互的 Icon
  • Icons:框架自带 Icon集合
  • IconTheme:Icon 主题
  • IconImage:通过 AssetImages 或者其他图片显示 Icon
  • 我们看下面的一个例子


image.png


Icon(
   Icons.phone,
   color: Colors.green,
   size: 80,
);


扩展:使用自定义的Icon

image.png

  • 2.2、图标按钮组件
    图标按钮组件(IconButton)是基于 Material Design 风格的组件,它可以响应按下事件,并且按下时会带一个水波纹的效果。如果它的 onPressed 回调函数为null, 那么这个按钮处于禁用的状态,并且不可以按下。


IconButton(
   icon: Icon(Icons.volume_up, size: 48.0,),
   tooltip: '按下操作',
   onPressed: () {
      print("按下操作");
   },
);


  • 2.3、RaisedButton 凸 起组件按钮(被废弃了),新的使用 ElevatedButton详细使用地址凸起组件按钮(RaisedButton) 是Material Design 风格中的 button ,一个凸起的材质矩形按钮,它可以响应以下事件,并且按下时会带一个触摸的效果。
  • RaisedButton


image.png


RaisedButton(
  child: Text("RaisedButton"),
  textColor: Colors.red,
  color: Colors.brown,
  onPressed: () {
    print("RaisedButton Click");
  },
)


  • FlatButton 废弃了,被 TextButton 取代


image.png


FlatButton(
   child: Text("FlatButton"),
   color: Colors.red,
   onPressed: () {
      print("FlatButton Click");
   },
)
  • TextButton的使用如下


TextButton(
   style: ButtonStyle(
     backgroundColor: MaterialStateProperty.all(Colors.brown), 
   ),
   onPressed: () {
     print("喜欢");
   },
   child: Row(
     mainAxisSize: MainAxisSize.min,
     children: [
       Text("喜欢"),
       Icon(Icons.favorite, color: Colors.red,)
     ],
   )
)

扩展

TextButton(
    style: ButtonStyle(
      //圆角
     shape: MaterialStateProperty.all(
         RoundedRectangleBorder(
             borderRadius:
                BorderRadius.circular(
                    18.67))),
     //边框
      side: MaterialStateProperty.all(
       BorderSide(
                          color: Colors.red,
            width: 0.67),
         ),
        //背景
         backgroundColor:
            MaterialStateProperty.all(
               Colors.transparent)),
      child: Text(
        '确定',
        style: TextStyle(
           fontWeight: FontWeight.bold,
           color: Colors.white,
         fontSize: 14),
        ),
       onPressed: () {}
)


  • OutlineButton


image.png

OutlineButton(
   child: Text("OutlineButton"),
   color: Colors.red,
   onPressed: () {
      print("FlatButton Click");
   },
)
  • FloatingActionButton


FloatingActionButton(
   child: Icon(Icons.add),
   onPressed: () {
      print("FloatingActionButton Click");
   },
)


  • 2.4、自定义 Button

image.png


FlatButton(
    color: Colors.amberAccent,
    shape: RoundedRectangleBorder(
      borderRadius: BorderRadius.circular(6.0)
    ),
    child: Row(
      mainAxisSize: MainAxisSize.min,
      children: <Widget>[
        Icon(Icons.favorite, color: Colors.red,),
        Text("喜欢你")
      ],
    ),
    onPressed: () {
      print("自定义FlatButton Click");
    },
  )


三、图片组件



Image支持的图片格式:JPEG、PNG、GIF、Animated GIF、WebP、Animated WebP,BMP和WBMP。

  • 3.1、Image.assets:加载本地资源图片;
  • 在Flutter项目中创建一个文件夹,存储图片,通过key从AssetBundle获得的图像
  • 在pubspec.yaml进行配置


image.png


assets:
   - assets/images/juren.jpeg
   - assets/images/2.0x/
   - assets/images/3.0x/
  • 配置完执行下:flutter packages get
  • 使用图片


AssetImage("assets/images/juren.jpeg")
  • 3.2、Image.network:加载网络中的图片;Image属性可以设置:


const Image({
   ...
   this.width, //图片的宽
   this.height, //图片高度
   this.color, //图片的混合色值
   this.colorBlendMode, //混合模式
   this.fit,//缩放模式
   this.alignment = Alignment.center, //对齐方式
   this.repeat = ImageRepeat.noRepeat, //重复方式
    ...
})


  • width、height:用于设置图片的宽、高,当不指定宽高时,图片会根据当前父容器的限制,尽可能的显示其原始大小,如果只设置width、height的其中一个,那么另一个属性默认会按比例缩放,但可以通过下面介绍的fit属性来指定适应规则。
  • fit:该属性用于在图片的显示空间和图片本身大小不同时指定图片的适应模式。适应模式是在BoxFit中定义,它是一个枚举类型,有如下值:
  • fill:会拉伸填充满显示空间,图片本身长宽比会发生变化,图片会变形。
  • cover:会按图片的长宽比放大后居中填满显示空间,图片不会变形,超出显示空间部分会被剪裁。
  • contain:这是图片的默认适应规则,图片会在保证图片本身长宽比不变的情况下缩放以适应当前显示空间,图片不会变形。
  • fitWidth:图片的宽度会缩放到显示空间的宽度,高度会按比例缩放,然后居中显示,图片不会变形,超出显示空间部分会被剪裁。
  • fitHeight:图片的高度会缩放到显示空间的高度,宽度会按比例缩放,然后居中显示,图片不会变形,超出显示空间部分会被剪裁。
  • none:图片没有适应策略,会在显示空间内显示图片,如果图片比显示空间大,则显示空间只会显示图片中间部分。
  • color和 colorBlendMode:在图片绘制时可以对每一个像素进行颜色混合处理,color指定混合色,而colorBlendMode指定混合模式;
  • repeat:当图片本身大小小于显示空间时,指定图片的重复规则。
  • 示例代码如下


final imageUrl = 'http://image.xcar.com.cn/attachments/a/day_200323/2020032314_59939b0716c40f9be872JrmcP75B4KfO.jpg-app';
Image(
   image: NetworkImage(imageUrl),
   width: 200,
   height: 200,
   // 宽度固定,高度自适应
   fit: BoxFit.fitHeight,
   // 范围 -1 到 1
   alignment: Alignment(0, 0),
);

扩展其他加载图片的方式

Image.file 从本地文件中获取图片

举例:

加载完整路径的本地图片
import 'dart:io';
Image.file(File('/sdcard/Download.Stack.png')),
加载相对路径的本地图片,需要导入插件:path_provider
导入头文件使用
import 'dart:io'
import 'package:path_provider/path_provider.dart'
FutureBuilder(future: _getLocalFile("Download/stack.png")
builder: (BuildContext context, AsyncSnapshot<File> snapshot) {
     return snapshot.data != null ? Image.file(snapshot.data) : Container();
}),
// 获取 SDCard的路径
Future<File> _getLocalFile(String filename) async {
    String dir (await getExternalStorageDirectory()).path;
    File f = File('$dir/$filename');
    return f;
}

Image.memory 用于从Uint8List获取图像


  • 3.3、如何设置 placeholder为了设置 Placeholder 我们需要借助 FadeInImage,它能够从内存,本地资源中加载 placeholder。插件:transparent_image
  • 使用方式如下:


FadeInImage.memoryNetwork(
      placeholder: kTansparentImage,
      image: '图片链接' 
)
  • 使用本地的资源图片作为placeholder


FadeInImage.assetNetwork(
     placeholder: 'assets/图片地址',
     image: '图片链接' 
)
  • 3.4、配置图片缓存
    在Flutter中我们可以借助:cached_network_image 插件,来从网络上加载图片,并将其缓存到本地,以供下次使用


CachedNetworkImage(
      placeholder: CircularProgressIndicator(),
      imageUrl: '图片链接'        
)
  • 3.5、实现圆角图像
  • 方式一:CircleAvatarCircleAvatar可以实现圆角头像,也可以添加一个子Widget:


const CircleAvatar({
   Key key,
   this.child, // 子Widget
   this.backgroundColor, // 背景颜色
   this.backgroundImage, // 背景图像
   this.foregroundColor, // 前景颜色
   this.radius, // 半径
   this.minRadius, // 最小半径
   this.maxRadius, // 最大半径
})
  • 我们来实现一个圆形头像
  • 注意一:这里我们使用的是NetworkImage,因为backgroundImage要求我们传入一个ImageProvider;
    ImageProvider是一个抽象类,事实上所有我们前面创建的Image对象都有包含image属性,该属性就是一个ImageProvider
  • 注意二:这里我还在里面添加了一个文字,但是我在文字外层包裹了一个Container;
    这里Container的作用是为了可以控制文字在其中的位置调整;


class HomeContent extends StatelessWidget {
   @override
   Widget build(BuildContext context) {
      return Center(
        child: CircleAvatar(
           radius: 100,
           backgroundImage: NetworkImage("https://tva1.sinaimg.cn/large/006y8mN6gy1g7aa03bmfpj3069069mx8.jpg"),
           child: Container(
              alignment: Alignment(0, .5),
              width: 200,
              height: 200,
              child: Text("兵长利威尔")
           ),
       ),
    );
  }
}
  • 方式二:ClipOval
    ClipOval也可以实现圆角头像,而且通常是在只有头像时使用


Center(
   child: ClipOval(
      child: Image.network(
          imageUrl,
          width: 200,
          height: 200,
      ),
   )
);


目录
相关文章
|
11月前
|
容器
Flutter Widget 解析
Flutter Widget 解析
130 2
|
12月前
深入理解Flutter鸿蒙next版本 中的Widget继承:使用extends获取数据与父类约束
本文详细介绍了Flutter中如何通过继承其他Widget来创建自定义组件。首先解释了Widget继承的基本概念,包括StatelessWidget和StatefulWidget的区别。接着通过具体示例展示了如何继承StatelessWidget和StatefulWidget,并在子类中访问父类的build方法和状态。最后,结合多个自定义Widget展示了如何在实际应用中灵活使用继承和组合来构建复杂的UI。
240 8
|
12月前
|
容器
flutter&鸿蒙next 使用 InheritedWidget 实现跨 Widget 传递状态
在 Flutter 中,状态管理至关重要。本文详细介绍了如何使用 InheritedWidget 实现跨 Widget 的状态传递。InheritedWidget 允许数据在 Widget 树中向下传递,适用于多层嵌套的场景。通过一个简单的计数器示例,展示了如何创建和使用 InheritedWidget,包括其基础概念、工作原理及代码实现。虽然 InheritedWidget 较底层,但它是许多高级状态管理解决方案的基础。
251 2
|
11月前
|
存储 容器
Flutter 有状态Widget 和 无状态Widget
Flutter 有状态Widget 和 无状态Widget
273 0
|
容器
flutter:第一个flutter&Widget的使用 (二)
本文介绍了Flutter框架下的基本组件及其用法,包括简单的 Stateless Widget 如文本和按钮,以及更复杂的 StatefulWidget 示例。详细解释了如何使用 `context` 获取祖先小部件的信息,并展示了 `MaterialApp` 的属性及用途。此外,还探讨了 `StatefulWidget` 与 `StatelessWidget` 的区别,以及 `AppBar` 的常见属性配置方法。适合Flutter初学者参考学习。
153 2
|
12月前
|
Dart JavaScript 前端开发
Flutter 的 Widget 概述与常用 Widgets 与鸿蒙 Next 的对比
Flutter 是 Google 开发的开源 UI 框架,用于快速构建高性能的移动、Web 和桌面应用。Flutter 通过 Widget 构建 UI,每个 UI 元素都是 Widget,包括文本、按钮、图片等。Widget 不仅描述外观,还描述行为,是不可变的。常见的 Widget 包括结构型(Container、Column、Row)、呈现型(Text、Image)、交互型(ElevatedButton)和状态管理型(StatefulWidget)。Flutter 与鸿蒙 Next 在组件化架构、开发语言、布局系统、性能和跨平台支持方面各有优势
314 0
|
Android开发
Flutter完整开发实战详解(六、 深入Widget原理),2024百度Android岗面试真题收录解析
Flutter完整开发实战详解(六、 深入Widget原理),2024百度Android岗面试真题收录解析
Flutter-底部弹出框(Widget层级)
文章描述了如何在Flutter中使用DraggableScrollableSheet创建一个底部弹出框,同时保持其可手势滑动关闭。作者遇到问题并提出对原控件进行扩展,以支持头部和列表布局的滑动关闭功能。
373 0
|
开发框架 前端开发 搜索推荐
【Flutter前端技术开发专栏】Flutter中的自定义Widget与渲染流程
【4月更文挑战第30天】探索Flutter的自定义Widget与渲染流程。自定义Widget是实现复杂UI设计的关键,优点在于个性化设计、功能扩展和代码复用,但也面临性能优化和复杂性管理的挑战。创建步骤包括设计结构、定义Widget类、实现构建逻辑和处理交互。Flutter渲染流程涉及渲染对象树、布局、绘制和合成阶段。实践案例展示如何创建带渐变背景和阴影的自定义按钮。了解这些知识能提升应用体验并应对开发挑战。查阅官方文档以深入学习。
239 0
【Flutter前端技术开发专栏】Flutter中的自定义Widget与渲染流程
Flutter StreamBuilder 实现局部刷新 Widget
Flutter StreamBuilder 实现局部刷新 Widget
206 0

热门文章

最新文章

下一篇
开通oss服务