Flutter之Widget

1.TextWidget文本组件

  • 常用属性,Style属性的用法,让文本漂亮起来

1.TextAlign 文本对齐属性
2.maxLines 文本显示的最大行数
3.overflow 控制文本的溢出效果

// 引入基础样式库,设计扁平化,谷歌推出的
import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Welcome to Flutter',
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Hello World'),
        ),
        body: const Center(
          child: Text(
            '你见过登山者吗?在湿滑的山路上,滑倒不能阻止他们向 上;你见过航海家吗?在波涛汹涌的海面上,即使风再大浪再高, 也无法阻挡他们奋勇向前,这就是坚强而又勇敢的勇气。',
            textAlign: TextAlign.left,
            // maxLines: 2, // 显示两行
            // overflow: TextOverflow.ellipsis, // 文本末尾``...``效果
            style: TextStyle(
              fontSize: 25, //字体大小
              color: Color.fromARGB(255, 255, 125, 125), // 字体色值
              decoration: TextDecoration.underline, // 字体下划线
              decorationStyle: TextDecorationStyle.solid, // 下划线为实线
            ),
          ),
        ),
      ),
    );
  }
}

2.Container容器组件

1.alignment属性
2.设置宽高和颜色
3.padding内边距属性
4.margin外边距属性
5.decoration属性制作彩色背景

  • padding内边距属性
    • EdegeInsets.all()统一设置
    • EdgeInsets.fromLTRB(left,top,right,borrom) 设置左边、上边、右边、下边间距
  • decoration属性
    • BoxDecoration Widget使用
    • LinearGradient设置背景颜色渐变
// ignore_for_file: avoid_unnecessary_containers

// 引入基础样式库,设计扁平化,谷歌推出的
import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Welcome to Flutter',
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Hello World'),
        ),
        body: Center(
            child: Container(
          child: const Text(
            'Hello wo!',
            style: TextStyle(
              fontSize: 40.0,
            ),
          ),
          // Container 对齐方式 有8种
          alignment: Alignment.topLeft,
          width: 500.0,
          height: 400.0,
          // 这个属性影响渐变效果,所有注释
          // color: Colors.lightBlue,

          // 内边距理解为 容器 和 child(内容)之间的间距
          // padding: const EdgeInsets.all(10.0),
          // fromLTRB 指 左边、顶部、右边、底部的间距
          padding: const EdgeInsets.fromLTRB(20.0, 30.0, 0.0, 0.0),

          // 外边距理解为 容器 和 外部视图之间间距
          margin: const EdgeInsets.all(20.0),

          // 设置渐变,通过盒子修饰器
          decoration: const BoxDecoration(
              gradient: LinearGradient(colors: [
            Colors.lightBlue,
            Colors.greenAccent,
            Colors.purpleAccent
          ])),
        )),
      ),
    );
  }
}

3.imageWidget图片组件

1.Image Widget的几种加入形式
2.Fit属性(图片和容器之间的关系,如BoxFit.fill是充满整个容器)
3.图片的混合模式
4.Repeat属性让图片重复

  • Image Widget的几种加入形式
    • Image.asset加载资源图片,会使打包时包体过大
    • Image.network网络资源图片,经常换的或者动态的图片
    • Image.file本地图片,比如相机照相后的图片预览
    • Image.memory加载到内存中的图片,Uint8List
// ignore_for_file: avoid_unnecessary_containers

// 引入基础样式库,设计扁平化,谷歌推出的
import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Welcome to Flutter',
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Hello World'),
        ),
        body: Center(
          child: Container(
            // 网络图片
            child: Image.network(
              'https://img1.sycdn.imooc.com/szimg/5c7e6835087ef3d806000338-360-202.jpg',
              // 缩放比例
              scale: 1.5,

              // 图片和容器之间的关系
              // fill充满容器 等7中方式
              // fit: BoxFit.fill,

              // 图片和颜色的混合模式 等20几种模式
              // color: Colors.greenAccent,
              // colorBlendMode: BlendMode.difference,

              // 图片重复显示
              // repeatX 横向重复、repeatY 纵向重复、noRepeat 不重复、repeat 横纵向都重复
              repeat: ImageRepeat.repeat,
            ),
            color: Colors.lightBlue,
            width: 400.0,
            height: 300.0,
          ),
        ),
      ),
    );
  }
}

4.ListViewWidget列表组件

1.ListView组件的语法
2.ListTitle的使用

// ignore_for_file: avoid_unnecessary_containers, prefer_const_constructors

// 引入基础样式库,设计扁平化,谷歌推出的
import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Welcome to Flutter',
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Hello World'),
        ),
        body: ListView(
          // ignore: prefer_const_literals_to_create_immutables
          children: [
            
            // 右边图片、中间文本为每行的内容
            // ListTile(
            //   leading: Icon(Icons.access_alarm_sharp),
            //   title: Text('access_alarm_sharp'),
            // ),
            // ListTile(
            //   leading: Icon(Icons.access_time_filled_rounded),
            //   title: Text('access_alarm_sharp'),
            // ),
            // ListTile(
            //   leading: Icon(Icons.account_balance_sharp),
            //   title: Text('access_alarm_sharp'),
            // ),

            // 网络图片为每行的内容
            Image.network(
              'https://img1.sycdn.imooc.com/szimg/5c7e6835087ef3d806000338-360-202.jpg',
            ),
            Image.network(
              'https://img3.sycdn.imooc.com/5cce8be1088dd62806000338-360-202.jpg',
            ),
            Image.network(
              'https://img2.sycdn.imooc.com/5a2f4d7f00012c8106000338-360-202.jpg',
            ),
          ],
        ),
      ),
    );
  }
}

5.横向列表和自定义组件

1.scrollDirection属性 滚动方向,Axis.horizontal 为横向滚动,Axis.vertical 为纵向滚动

// 引入基础样式库,设计扁平化,谷歌推出的

// ignore_for_file: avoid_unnecessary_containers, prefer_const_constructors

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Welcome to Flutter',
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Hello World'),
        ),
        // ignore: sized_box_for_whitespace
        body: Container(
          height: 200.0,
          child: MyList(),
        ),
      ),
    );
  }
}

class MyList extends StatelessWidget {
  const MyList({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    // ignore: todo
    // TODO: implement build
    return ListView(
      // 设置滚动方向,Axis.horizontal 为横向滚动,Axis.vertical 为纵向滚动
      scrollDirection: Axis.horizontal,
      children: [
        // 右边图片、中间文本为每行的内容
        // ListTile(
        //   leading: Icon(Icons.access_alarm_sharp),
        //   title: Text('access_alarm_sharp'),
        // ),
        // ListTile(
        //   leading: Icon(Icons.access_time_filled_rounded),
        //   title: Text('access_alarm_sharp'),
        // ),
        // ListTile(
        //   leading: Icon(Icons.account_balance_sharp),
        //   title: Text('access_alarm_sharp'),
        // ),

        // 网络图片为每行的内容
        Image.network(
          'https://img1.sycdn.imooc.com/szimg/5c7e6835087ef3d806000338-360-202.jpg',
        ),
        Image.network(
          'https://img3.sycdn.imooc.com/5cce8be1088dd62806000338-360-202.jpg',
        ),
        Image.network(
          'https://img2.sycdn.imooc.com/5a2f4d7f00012c8106000338-360-202.jpg',
        ),
      ],
    );
  }
}

6.动态列表

1.传参和接收参数书写
2.实现动态列表ListView.builder(itemCount:列表的item个数, itemBuilder:该参数为一个方法,需要 return 一个Widget)

// ignore_for_file: avoid_unnecessary_containers, prefer_const_constructors

// 引入基础样式库,设计扁平化,谷歌推出的
import 'package:flutter/material.dart';

void main() => runApp(MyApp(
      // 传参,构造list数据,使用方法generate(列表长度,一个方法)
      items: List<String>.generate(1000, (index) => 'Item $index'),
    ));

class MyApp extends StatelessWidget {
  // 存放外界传入的数据
  final List<String> items;

  // 覆写构造方法,作用于传参,
  // required 修饰为必传项
  // : 符号后为调用父类构造方法
  // ignore: prefer_const_constructors_in_immutables
  MyApp({Key? key, required this.items}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Welcome to Flutter',
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Hello World'),
        ),
        // ignore: sized_box_for_whitespace
        body: ListView.builder(
          // 列表的item个数
          itemCount: items.length,
          // 该参数为一个方法,需要 return 一个Widget,这边可以通过index判断,写不同的widget
          itemBuilder: (context, index) {
            return ListTile(
              // ignore: unnecessary_string_interpolations
              title: Text(items[index]),
            );
          },
        ),
      ),
    );
  }
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容