Flutter学习(二)

写一个hello word

编辑lib下的main.dart文件
在这里插入图片描述
项目自动创建的main.dart内容如下
在这里插入图片描述
为了方便学习,我们main.dart清空,分步骤来写Hello world

  • 导包 import ‘package:flutter/material.dart’;
    谷歌提供的面向扁平化设计风格控件
  • 入口函数
void main() => runApp(MyApp());
  • 定义MyApp类,继承与静态组件(StatefullWudget 动态组件;StatelessWidget静态组件)
  • 重写build方法,返回一个Widget组件,组件有很多属性,title、theme、home等,我们需要牢记的是在flutter中一切皆组件
class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      //Scaffold脚手架
      home: Scaffold(
        appBar: AppBar(
          title: Text("Hello World"),
        ),
        body: Center(
          child: Text("Hello World !!!"),
        ),
      ),
    );
  }
}

运行结果:
在这里插入图片描述

Flutter组件

还是要强调一下,Flutter一切皆组件

TextWidget文本组件

  • TextWiget常用属性
    TextAlign:文本对齐属性
    maxLines:文本显示的最大行数
    overflow:控制文本的溢出效果
  • Style属性的用法,让文本漂亮起来
class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'TextWidget',
      //Scaffold脚手架
      home: Scaffold(
        appBar: AppBar(
          title: Text("TextWidget"),
        ),
        body: Center(
          child: Text(
            "就是Android IOS winphone,网页端四分天下的格局,每个公司需要维护四个团队,这样成本很高,所以就有了一个迫切的需求,能否开发一套在多个平台上运行,这样可以大大降低开发成本。",
            textAlign: TextAlign.left,
            maxLines: 5,
            overflow: TextOverflow.fade,
            style: TextStyle(
              fontSize: 25.0,
              color: Color.fromARGB(255, 255, 150, 150),
              decoration: TextDecoration.underline,
              decorationStyle: TextDecorationStyle.solid
            ),
          ),
        ),
      ),
    );
  }
}

运行效果:
在这里插入图片描述
但是为毛第一行多了一条下划线呢?
一顿调试之后发现有英文就会多出这条下划线,没有英文就正常,咋个么回事????
在这里插入图片描述
ContainerWidget容器组件讲解
相当于div,放元素的一个容器或者说层

  • 如何创建一个容器组件
  • Alignment属性的使用(9种对齐方式)
  • 设置宽高和颜色
  • Padding内边距属性的使用
    EdgeInsets.all()统一设置
    EdgeInsets.fromLTRB(value1,value2,value3,value4)分别设置
  • margin外边距属性的使用
  • decoration属性制作彩色背景
    设置容器的边框
    LinearGtadient设置背景颜色渐变
  • BoxDecoration Widget
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
  return MaterialApp(
    title: 'TextWidget',
    //Scaffold脚手架
    home: Scaffold(
      appBar: AppBar(
        title: Text("TextWidget"),
      ),
      body: Center(
        child: Container(
          child: Text(
              "Hello World",
            style: TextStyle(
              fontSize: 40
            ),
          ),
          alignment: Alignment.topLeft,
          width: 500,
          height: 400,
          //color: Colors.blue,
          padding: const EdgeInsets.fromLTRB(10, 50, 0, 0),
          margin: const EdgeInsets.all(10),
          decoration: BoxDecoration(
            gradient: const LinearGradient(
                colors:[
                  Colors.blue,
                  Colors.amber,
                  Colors.amberAccent
                ]
            )
          ),
        )
      ),
    ),
  );
}
}

运行效果:
在这里插入图片描述
如果这样写:
在这里插入图片描述就会报错:
在这里插入图片描述color和BoxDecoration使用冲突啦,不能同时用
在这里插入图片描述
ImageWidget图片组件

  • Image Widget的几种加入形式
    image.asset:加载资源图片,会使包体积过大
    image.network:网络资源图片
    image.file:本地图片
    image.memory:加载到内存中的图片
  • Fit属性,BoxFit的各种属性自己试下就可以了
  • 图片的混合模式
  • Repeat属性让图片重复效果
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
  return MaterialApp(
    title: 'TextWidget',
    //Scaffold脚手架
    home: Scaffold(
      appBar: AppBar(
        title: Text("TextWidget"),
      ),
      body: Center(
        child:Container(
          child: Image.network(
            "https://imgsa.baidu.com/news/q%3D100/sign=f0bd6fbdadcc7cd9fc2d30d909012104/d058ccbf6c81800a45cafd5ebf3533fa828b47b6.jpg",
            //值越大图片越小
            scale:4,
            fit: BoxFit.contain,
            //图片的叠加模式
            color: Colors.amberAccent,
            colorBlendMode: BlendMode.colorBurn,
            //图片填满容器
            repeat: ImageRepeat.repeat,
          ),
          width: 200,
          height: 400,
          color: Colors.amberAccent,
        )
      ),
    ),
  );
}
}

运行效果:
在这里插入图片描述
ListViewWidget组件

  • Listview组件的语法
  • ListTile的使用
class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'TextWidget',
      //Scaffold脚手架
      home: Scaffold(
        appBar: AppBar(
          title: Text("TextWidget"),
        ),
        body: ListView(
          children: <Widget>[
            ListTile(
              leading: Icon(Icons.border_right),
              title: Text("border_right"),
            ),
            ListTile(
              leading: Icon(Icons.border_right),
              title: Text("border_right"),
            ),
            ListTile(
              leading: Icon(Icons.border_right),
              title: Text("border_right"),
            ),
            Image.network("https://imgsa.baidu.com/news/q%3D100/sign=f0bd6fbdadcc7cd9fc2d30d909012104/d058ccbf6c81800a45cafd5ebf3533fa828b47b6.jpg"),
            Image.network("https://imgsa.baidu.com/news/q%3D100/sign=f0bd6fbdadcc7cd9fc2d30d909012104/d058ccbf6c81800a45cafd5ebf3533fa828b47b6.jpg"),
            Image.network("https://imgsa.baidu.com/news/q%3D100/sign=f0bd6fbdadcc7cd9fc2d30d909012104/d058ccbf6c81800a45cafd5ebf3533fa828b47b6.jpg"),
            Image.network("https://imgsa.baidu.com/news/q%3D100/sign=f0bd6fbdadcc7cd9fc2d30d909012104/d058ccbf6c81800a45cafd5ebf3533fa828b47b6.jpg"),
            Image.network("https://imgsa.baidu.com/news/q%3D100/sign=f0bd6fbdadcc7cd9fc2d30d909012104/d058ccbf6c81800a45cafd5ebf3533fa828b47b6.jpg"),
          ],
        ),

      ),
    );
  }
}

运行效果:
在这里插入图片描述
横向列表

  • 制作横向列表
  • scrollDirection属性的讲解
    Axis.horizontal:横向滚动或者叫水平方向滚动
    Axis.vertical:纵向滚动或者叫垂直方向滚动
class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'TextWidget',
      //Scaffold脚手架
      home: Scaffold(
        appBar: AppBar(
          title: Text("TextWidget"),
        ),
        body: Center(
          child: Container(
            height: 200,
            child: ListView(
              scrollDirection: Axis.horizontal,
              children: <Widget>[
                Container(
                  width: 180,
                  color: Colors.amberAccent,
                ),
                Container(
                  width: 180,
                  color: Colors.blue,
                ),
                Container(
                  width: 180,
                  color: Colors.deepOrange,
                ),
                Container(
                  width: 180,
                  color: Colors.purple,
                ),
              ],
            ),
          ),
        )
      ),
    );
  }
}

运行效果:
在这里插入图片描述
代码优化,自定义组件
以上ListView显得嵌套很多,利用自定义组件优化如下

class MyApp extends StatelessWidget {
 // This widget is the root of your application.
 @override
 Widget build(BuildContext context) {
   return MaterialApp(
     title: 'TextWidget',
     //Scaffold脚手架
     home: Scaffold(
         appBar: AppBar(
           title: Text("TextWidget"),
         ),
         body: Center(
           child: Container(
             height: 200,
             child: MyListView(),
           ),
         )
     ),
   );
 }
}

class MyListView extends StatelessWidget {
 @override
 Widget build(BuildContext context) {
   // TODO: implement build
   return ListView(
     scrollDirection: Axis.horizontal,
     children: <Widget>[
       Container(
         width: 180,
         color: Colors.amberAccent,
       ),
       Container(
         width: 180,
         color: Colors.blue,
       ),
       Container(
         width: 180,
         color: Colors.deepOrange,
       ),
       Container(
         width: 180,
         color: Colors.purple,
       ),
       Container(
         width: 180,
         color: Colors.black,
       ),
     ],
   );
 }
}

动态列表的使用

  • Dart中List类型的使用
    可以看成是数组,声明List的4种方式
  • 传递和接受参数,实现动态列表的基础
  • 动态列表制作
void main() =>
    runApp(MyApp(
        items: List<String>.generate(1000, (i) => "item $i")
    ));

class MyApp extends StatelessWidget {
  ///接收参数
  final List<String> items;
  ///构造方法
  MyApp({Key key, @required this.items}) :super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        title: 'ListWidget',
        //Scaffold脚手架
        home: Scaffold(
        appBar: AppBar(
        title: Text("ListWidget"),
    ),
    body: ListView.builder(
    itemCount: items.length,
    itemBuilder: (context, index) {
    return ListTile(title: Text("${items[index]}"));
    })
    ),
    );
    }
  }

运行效果:
在这里插入图片描述
GridView组件

  • GridView网格列表的使用
  • GridView Widget 属性
    padding:设置内边距
    crossAxisSpacing\ mainAxisSpacing:网格间的空隙
void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: "抽奖布局",
      home: Scaffold(
          appBar: AppBar(
            title: Text("抽奖布局"),
          ),
          body: GridView.count(
            padding: const EdgeInsets.all(10),
            //副轴(左右)
            crossAxisSpacing: 10,
            //主轴(上下)
            mainAxisSpacing: 10,
            crossAxisCount: 3,
            //宽高比
            childAspectRatio: 1,
            children: <Widget>[
              Image.network("https://pic1.iqiyipic.com/common/20190410/sevenDayPrize_03.png",scale:1,fit: BoxFit.cover,),
              Image.network("https://pic1.iqiyipic.com/common/20190410/sevenDayPrize_07.png",scale:1,fit: BoxFit.cover,),
              Image.network("https://pic1.iqiyipic.com/common/20190410/sevenDayPrize_05.png",scale:1,fit: BoxFit.cover,),
              Image.network("https://pic1.iqiyipic.com/common/20190410/sevenDayPrize_13.png",scale:1,fit: BoxFit.cover,),
              Image.network("https://pic0.iqiyipic.com/common/20190410/sevenDay-9.gif",scale:1,fit: BoxFit.cover,),
              Image.network("https://pic1.iqiyipic.com/common/20190410/sevenDayPrize_12.png",scale:1,fit: BoxFit.cover,),
              Image.network("https://pic1.iqiyipic.com/common/20190411/sevenDayPrize_18.png",scale:1,fit: BoxFit.cover,),
              Image.network("https://pic1.iqiyipic.com/common/20190410/sevenDayPrize_17.png",scale:1,fit: BoxFit.cover,),
              Image.network("https://pic1.iqiyipic.com/common/20190410/sevenDayPrize_16.png",scale:1,fit: BoxFit.cover,),

            ],
          )),
    );
  }
}

运行效果:
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章