Flutter第一章(Center,Text,Container,MaterialApp ,Scaffold)

版权声明:本文为作者原创书籍。转载请注明作者和出处,未经授权,严禁私自转载,侵权必究!!!
情感语录:欢乐就是坚强的发条,使永恒的自然循环不息。在世界的大钟里面,欢乐是推动齿轮的动力

大家好,欢迎来到Flutter专栏。你可能不会移动端开发,无论会与不会都没关系,Flutter专栏将带你走进双移动端的领域。或许你两端原生开发都会,也会面对写两套原生代码的问题,就算能力足够,可能留给你的时间也不够。能不能一套代码多平台使用呢?当然可以啦!! Google 公司的一伟大创举Flutter就诞生了,Flutter当前正火,在短短的时间内可以说是步步逼近 React Native,虽然在学习成本上 Flutter 远高 RN(当然看你目前是否掌握相应的语言基础),但在性能上是略胜一筹,它和原生基本无异。Flutter是以后的一个发展方向,为了更好的拥抱未来,所以学习Flutter很有必要,要学好Flutter你得先掌握Dart语言,如果你没有Dart语言基础请先观看我上期内容: 戳这里☞《 Flutter大战前夜之Dart语言(上)》; 《Flutter大战前夜之Dart语言(下)》) 两篇文章带你轻松入门 Dart 语言基础。

本章简要:

1、Center 居中容器组件

2、Text 文本组件

3、Container 容器组件

4、MaterialApp 和 Scaffold 主题组件

5、简单的自定组件Widget

有关Flutter在 Windows 和 Mac 平台的环境搭建介绍:

英文版地址:https://flutter.dev/docs/get-started/install

一、Flutter 目录结构介绍

使用你的IDE创建一个Flutter默认工程,我这里使用的Android Studio,其他开发工具也是一样,结构如下。

image.png

我们着重需要注意一下几个文件夹,其他的暂时不用理会

文件夹                 作用

android                android 平台相关代码

ios                    ios 平台相关代码
    
lib                    flutter 相关代码,主要编写的代码就在这个文件夹
    
test                   用于存放测试代码
    
pubspec.yaml           配置文件,一般存放一些第三方库的依赖。

【温馨小贴士】 Flutter程序是可以支持 Android 的一级语言Kotlin 和 IOS 的Swift语言,如果需要原生语言的支持请在创建项目的时候进行勾选配置。

默认工程代码,去掉注释大致如下:

    import 'package:flutter/material.dart';

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

    class MyApp extends StatelessWidget {
    // This widget is the root of your application.
    @override
    Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
     }
    }

    class MyHomePage extends StatefulWidget {
    MyHomePage({Key key, this.title}) : super(key: key);
    final String title;

    @override
    _MyHomePageState createState() => _MyHomePageState();
    }

    class _MyHomePageState extends State {
    int _counter = 0;

    void _incrementCounter() {
    setState(() {
      _counter++;
    });
    }

    @override
    Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.display1,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ), // This trailing comma makes auto-formatting nicer for build methods.
    );
     }
    }

从上面demo代码来看,可能有点懵,看不懂没关系,下面分别一点点来介绍。

二、Flutter 入口文件、入口方法

每一个 flutter 项目的 lib 目录里面都有一个 main.dart 文; 它就是 flutter 的入口文件

  void main(){
     runApp(MyApp());
  }
 //也可以简写
  void main()=>runApp(MyApp());

其中的 main 方法是 dart 的入口方法。runApp 方法是 flutter 的入口方法。MyApp 是自定义的一个组件,关键字 new 可以不写,写成 new MyApp()也没有错,在开发中常常不写,当然这也看你个人习惯。

三、组件

Flutter的视图都是通过组件绘制的,没有像Android 原生开发中那样可以通过xml文件进行视图绘制,习惯了Android 开发的同学对于这点来说可能很难适应。

1、Center组件:

你可以看着是一个窗口视图,或者说就是当前屏幕,当然这是取决于父容器的作用范围,和自身的大小,该组件顾名思义就是将子组件放置在自己的中心位置。

2、Text组件:

这就是一个文本组件,用于显示文本信息,在Android原生中它相当于充当TextView控件一样的效果。

下面我们来看一个例子:

import 'package:flutter/material.dart';
void main(){
  runApp(Center( child: Text(

    "我是一个文本内容", textDirection: TextDirection.ltr, //让文字从左向右流动
  ),
  ));
}

效果如下:

Text组件.png

此时的Center组件你可以看做就是整个屏幕,而屏幕中间放了一个文本组件Text来显示我们的内容。

3、自定义组件:

自定义组件如同原生开发中一样继承View或者ViewGroup类去实现你自己想要的界面,在 Flutter 中自定义组件其实也是一个类,这个类需要继承 StatelessWidget 或 StatefulWidget。 前期我们都继承 StatelessWidget。后面会讲到StatefulWidget 的使用。

【StatelessWidget 与 StatefulWidget 二者大致区分】

StatelessWidget 是无状态组件,状态不可变的 widget

StatefulWidget 是有状态组件,持有的状态可能在 widget 生命周期改变

下面我们来简化下runApp 并给Text组件加点样式

import 'package:flutter/material.dart';
void main(){
  runApp(MyApp());
}
class MyApp extends StatelessWidget{
  @override
  Widget build(BuildContext context) {
    return Center(
      child: Text(
        "中文,是世界上最美的语言",
        textDirection: TextDirection.ltr, //让文字从左向右流动

        //添加样式
        style: TextStyle(
            fontSize: 40.0, //设置40号字体
            fontWeight: FontWeight.bold, //加粗
            //设置字体颜色的三种方式
            // color: Colors.yellow
           //color: Color.fromRGBO(255, 222, 222, 0.5)
             color:Color.fromARGB(22, 255, 118, 18) 
        ),
      ),
    );
  }
}

运行起来屏幕会上显示我们添加了点文字效果。需要注意的是Flutter中的这些样式都是通过命名函数进行配置的,在写的时候,一定的和函数中的名称一致,不然会报错。

4、MaterialApp 和 Scaffold 组件

① 、MaterialApp组件
MaterialApp 是一个方便的 Widget,它封装了应用程序实现 Material Design 所需要的一些 Widget。一般作为顶层 widget 使用,常用属性如下:

 home(主页)
 title(标题)
 color(颜色)
 theme(主题)
 routes(路由)

②、Scaffold
Scaffold 是 Material Design 布局结构的基本实现。此类提供了用于显示 drawer、snackbar 和底部 sheet 的 API。
Scaffold 有下面几个主要属性:

appBar - 显示在界面顶部的一个 AppBar。
body - 当前界面所显示的主要内容 Widget。
drawer - 抽屉菜单控件。

从上面的实例呆萌来看一点都不美观,这里介绍了MaterialApp 和 Scaffold 两个组件,我们可以轻松实现像Android 原生开发中带有一个主题和ActionBar的样式,当然这两个组件的用法不止下面这么简单,更多的使用会在后面的章节实战中慢慢拓展。

import 'package:flutter/material.dart';

//dart程序入口
void main(){

  //flutter 程序入口
  runApp(MyApp());
}

//自定义组件
class MyApp extends StatelessWidget{
  @override
  Widget build(BuildContext context) {

    return MaterialApp(

      home:Scaffold(

        //设置标题栏
        appBar:AppBar(
            title:Text('呆萌')
        ),
        //设置内容区域
        body:Content(),
      ),
      //设置主题色
      theme: ThemeData(
          primarySwatch: Colors.yellow
      ),
    );
  }

}

//自定义的内容
class Content extends StatelessWidget{

  @override
  Widget build(BuildContext context) {
    return Center(
        child:Text(
          "中文,是世界上最美的语言",
          textDirection: TextDirection.ltr,////让文字从左向右流动

          style: TextStyle(
            fontSize: 40.0, //设置40号字体
            color: Colors.yellow, // 设置字体颜色
          ),
        )
    );
  }
}

这样基本实现了我们原生开发中构建默认空工程效果样子,结果大致如下:


image.png

大致了解Text组件和Container组件的使用,下面来详细介绍下这两个组件中常用的属性,当然这里并未完全列举出来,这里只是开发中常用的而已,更多信息需要自己参看源码或者官方文档 戳这里 (Text组件) ;戳这里 (Container组件)

一、Text组件:
                    
名称                  功能

textAlign             本对齐方式(center 居中,left 左
                      对齐,right 右对齐,justfy 两端对齐)
                      textDirection 文本方向(ltr 从左至右,rtl 从右至左)
                    
overflow              文字超出屏幕之后的处理方式(clip
                      裁剪,fade渐隐,ellipsis省略号)
                    
textScaleFactor       字体显示倍率

maxLines              文字显示最大行数

style                 字体的样式设置


下面是TextStyle的参数:

名称                  功能

decoration            文字装饰线(none 没有线,lineThrough 删
                      除线,overline 上划线,underline 下划线)
                      
decorationColor       文字装饰线颜色

decorationStyle       文字装饰线风格([dashed,dotted]虚线,
                      double 两根线,solid 一根实线,wavy 波浪
                      线)
                      
wordSpacing           单词间隙(如果是负值,会让单词变得更紧凑)
     
letterSpacing         字母间隙(如果是负值,会让字母变得更紧凑)

fontStyle             文字样式(italic 斜体,normal 正常体)

fontSize              文字大小

color                 文字颜色

fontWeight            字体粗细(bold 粗体,normal 正常体)


二、Container组件

名称                  功能

alignment             topCenter:顶部居中对齐
                      topLeft:顶部左对齐
                      topRight:顶部右对齐
                      center:水平垂直居中对齐
                      centerLeft:垂直居中水平居左对齐
                      centerRight:垂直居中水平居右对齐
                      bottomCenter 底部居中对齐
                      bottomLeft:底部居左对齐
                      bottomRight:底部居右对齐
                      
decoration            decoration:BoxDecoration(   //设置容器样式
                          color: Colors.blue,  //Container的整体背景颜色
                          border: Border.all(  //设置边框颜色和宽度
                            color: Colors.red,
                            width: 2.0,
                       ),
                       
borderRadius         BorderRadius.all(//设置边框四边都圆角
                         Radius.circular(8.0)
                      )
                     )
margin               margin 属性是表示Container与外部其他组件的距离。


padding              padding 就是内边距,指Container 边缘与Child之间的距离

transform            让 Container进行一些位移旋转之类


height               容器高度

width                容器宽度

child                容器子元素

四、本章实战

要求:在屏幕中心绘制一个正方形且让四边角进行10个单位的圆角,在中心区域显示一段文字,且配置些样式,如颜色,字体大小和文本穿轴线等。

import 'package:flutter/material.dart';

//dart入口
void main(){

  //flutter 入口
  runApp(MyApp());
}

//自定义组件
class MyApp extends StatelessWidget{

  //实现抽象方法
  @override
  Widget build(BuildContext context) {

    return MaterialApp(
        home:Scaffold(

           //导航栏 可以理解是原生中的ActionBar
            appBar: AppBar(

              // 设置ActionBar 标题
                title:Text("呆萌")
            ),
            // 内容区域
            body:HomeContent()
        )
    );
  }
}

class HomeContent extends StatelessWidget{
  @override
  Widget build(BuildContext context) {

    // 此时的Center 就是整个屏幕除去状态栏和appbar的区域
    return Center(

      //在Center区域创建一个容器 宽高300
      child: Container(
        height: 300.0,
        width: 300.0,

        //设置容器样式
        decoration: BoxDecoration(
            //Container的整体背景颜色
            color: Colors.yellow,

            //设置边框颜色和宽度
            border: Border.all(
                color: Colors.blue,
                width: 2.0
            ),
            //设置边框四边都圆角10个单位
            borderRadius: BorderRadius.all(
              Radius.circular(10),
            )
        ),

        //设置内边距 左上右下都为20
        padding:EdgeInsets.all(20),

        //设置外边距 左上右下
        margin: EdgeInsets.fromLTRB(10, 10, 10, 10),

        //按x轴位移100个单位
//        transform:Matrix4.translationValues(100,0,0),
        //按z轴旋转百分之30
//        transform:Matrix4.rotationZ(0.3),
        //将X对角线提示到1.2倍长度,既高度不变,宽度会被拉伸
//         transform:Matrix4.diagonal3Values(1.2, 1, 1),
        //设置子元素的对齐方式 居中,既Container 区域中部
        alignment: Alignment.center,
        //添加一个子元素
        child: Text(
             //设置文本内容
            '全世界都在说中国话,孔夫子的话越来越国际化',
            // 设置文字左对齐
            textAlign:TextAlign.left,
            //文本超出长度 后...显示方法,需要结合 maxLines使用
            overflow:TextOverflow.ellipsis ,
            // 最大显示行数
            maxLines: 2,
            //字体显示倍率
            textScaleFactor: 1.2,
            //设置文本样式
            style:TextStyle(
                //16号字体
                fontSize: 15.0,
                //文字红色
                color:Colors.red,
                fontWeight: FontWeight.w800,
                //斜体
                fontStyle: FontStyle.italic,
                //穿轴线
                decoration:TextDecoration.lineThrough,
                //穿轴线显色
                decorationColor:Colors.black,
                //穿轴线为虚线
                decorationStyle: TextDecorationStyle.dashed,
                //字母间隙(如果是负值,会让字母变得更紧凑)
                letterSpacing: 5.0

            )
        ),
      ),
    );
  }

}

代码中的备注已经有了详细介绍,这里就不在描述了,大致效果如下:


image.png
温馨提示:常用开发指令

通过命令行 执行flutter run

R 键:点击后热加载,也就算是重新加载吧。
P 键:显示网格,这个可以很好的掌握布局情况,工作中很有用。
O 键:切换android和ios的预览模式。
Q 键:退出调试预览模式。

【讨论:】在Android原生开发中这么一个界面只需要在xml布局文件就能很轻松实现,但在Flutter 却要写这么大一堆代码,那么你更喜欢那种方式呢?抛开Flutter能生产IOS应用外,你觉得Flutter中这样的做法到底有什么好处呢?

开篇文章内容并不复杂也没有太多可讲的内容,只是简单入门了解,学习时参照上面案例进行多加练习下即可。本章内容到此就结束了,如有不正欢迎留言指正,如果喜欢可以留下你的小红心!O(∩_∩)O 谢谢大家的观看,下章再会!!

你可能感兴趣的:(Flutter第一章(Center,Text,Container,MaterialApp ,Scaffold))