flutter 项目新手向结构简析

flutter中一切界面层级的东西全部都是Widget
这句话怎么理解呢?

大到整个应用,小到一个文字控件,全部都是Widget


一个常规的Application图级可能是这样的,当然实际情况下会比这复杂很多


flutter 项目新手向结构简析_第1张图片
结构图

对应代码和实际情况看一下

为了和图片对应 我把所有的写到一个文件里


import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'Flutter 结构简析',
      theme: new ThemeData(
        primarySwatch: Colors.blue, // 这里是项目的主色调
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      body: ListView(
        children: [
          ListTile(title: Text('我是第一个item')),
          ListTile(title: Text('我是第二个item')),
        ],
      ),
    );
  }
}

flutter 项目新手向结构简析_第2张图片
项目截图

这里的一切皆widget的意思就是
Application是Widget
Page是
Scaffold是
Appbar是
ListView是
ListTile也是
Text也是

组合达到常见的效果

以官方的一个页面为例子
https://flutter.io/tutorials/layout/

flutter 项目新手向结构简析_第3张图片
lakes-anno.png


我们来做的话就是整体是一个Column或者ListView
然后子项目是

Image
Row
  Column
    Text
    Text
  Row
    Image(Icon)
    Text
Row
  Column
      Row
        Image 
        Text
  Column
  Column
Text

当然这个是指的主体结构,实际上还会有更多的
接着不看这个链接里的代码,自己撸一个demo

demo相关


一阶段 头部图片

第一阶段对应的截图


flutter 项目新手向结构简析_第4张图片
image.png

代码

class TutorialsPage extends StatefulWidget {
  @override
  _TutorialsPageState createState() => _TutorialsPageState();
}

class _TutorialsPageState extends State {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: ListView(
        children: [
          //为了好分辨,我将内部的4大块分为四个方法
          _buildHeader(),
        ],
      ),
    );
  }

  Widget _buildHeader() {
    // 这里对应的是图片
    return Image.asset("images/lakes_header.jpg");
  }
}

二阶段

第二阶段的截图


flutter 项目新手向结构简析_第5张图片
image.png

class _TutorialsPageState extends State {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: ListView(
        children: [
          //为了好分辨,我将内部的4大块分为四个方法
          _buildHeader(),
          Padding(
            //这里我观察到下面有一个整体的左右边距,所以这里单独抽取了一个padding
            child: Column(
              children: [
                _buildSecond(), // 第二部分
              ],
            ),
            padding: const EdgeInsets.only(
              left: 30.0,
              right: 30.0,
            ),
          ),
        ],
      ),
    );
  }

  Widget _buildHeader() {
    // 这里对应的是图片
    return Image.asset("images/lakes_header.jpg");
  }

  _buildSecond() {
    Widget row = Row(
      children: [
        Expanded(
          child: Column(
            children: [
              Text('旅游圣地'),
              Text('不要钱',style: TextStyle(fontSize: 12.0,color: Colors.grey),),
            ],
            mainAxisAlignment: MainAxisAlignment.spaceEvenly,
            crossAxisAlignment: CrossAxisAlignment.start,
          ),
        ),
        Row(
          children: [
            Icon(
              Icons.star,
              color: Colors.yellow,
            ),
            Text('30'),
          ],
        ),
      ],
    );
    row = SizedBox(
      height: 60.0,
      child: row,
    );
    return row;
  }
}

第三部分

截图:


flutter 项目新手向结构简析_第6张图片
第三步

/// 对应 https://flutter.io/tutorials/layout/ 的 https://flutter.io/tutorials/layout/images/lakes.jpg 图片
class TutorialsPage extends StatefulWidget {
  @override
  _TutorialsPageState createState() => _TutorialsPageState();
}

class _TutorialsPageState extends State {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: ListView(
        children: [
          //为了好分辨,我将内部的4大块分为四个方法
          _buildHeader(),
          Padding(
            //这里我观察到下面有一个整体的左右边距,所以这里单独抽取了一个padding
            child: Column(
              children: [
                _buildSecond(), // 第二部分
                _buildThird(), // 第二部分
              ],
            ),
            padding: const EdgeInsets.only(
              left: 30.0,
              right: 30.0,
            ),
          ),
        ],
      ),
    );
  }

  Widget _buildHeader() {
    // 这里对应的是图片
    return Image.asset("images/lakes_header.jpg");
  }

  _buildSecond() {
    Widget row = Row(
      children: [
        Expanded(
          child: Column(
            children: [
              Text('旅游圣地'),
              Text('不要钱',style: TextStyle(fontSize: 12.0,color: Colors.grey),),
            ],
            mainAxisAlignment: MainAxisAlignment.spaceEvenly,
            crossAxisAlignment: CrossAxisAlignment.start,
          ),
        ),
        Row(
          children: [
            Icon(
              Icons.star,
              color: Colors.yellow,
            ),
            Text('30'),
          ],
        ),
      ],
    );
    row = SizedBox(
      height: 60.0,
      child: row,
    );
    return row;
  }

  _buildThird() {
    Widget buildItem(IconData iconData, String text) {
      return Expanded(
        child: SizedBox(
          height: 50.0,
          child: Column(
            children: [
              Icon(
                iconData,
                color: Colors.blue,
              ),
              Text(
                text,
                style: TextStyle(color: Colors.blue),
              ),
            ],
            mainAxisAlignment: MainAxisAlignment.spaceEvenly,
          ),
        ),
      );
    }

    return Row(
      children: [
        buildItem(Icons.phone, '呼叫'),
        buildItem(Icons.room, '导航'),
        buildItem(Icons.share, '分享'),
      ],
    );
  }
}

第四部分

image.png

/// 对应 https://flutter.io/tutorials/layout/ 的 https://flutter.io/tutorials/layout/images/lakes.jpg 图片
class TutorialsPage extends StatefulWidget {
  @override
  _TutorialsPageState createState() => _TutorialsPageState();
}

class _TutorialsPageState extends State {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: ListView(
        children: [
          //为了好分辨,我将内部的4大块分为四个方法
          _buildHeader(),
          Padding(
            //这里我观察到下面有一个整体的左右边距,所以这里单独抽取了一个padding
            child: Column(
              children: [
                _buildSecond(), // 第二部分
                _buildThird(),
                _buildFourth(),
              ],
            ),
            padding: const EdgeInsets.only(
              left: 30.0,
              right: 30.0,
            ),
          ),
        ],
      ),
    );
  }

  Widget _buildHeader() {
    // 这里对应的是图片
    return Image.asset("images/lakes_header.jpg");
  }

  _buildSecond() {
    Widget row = Row(
      children: [
        Expanded(
          child: Column(
            children: [
              Text('旅游圣地'),
              Text(
                '不要钱',
                style: TextStyle(fontSize: 12.0, color: Colors.grey),
              ),
            ],
            mainAxisAlignment: MainAxisAlignment.spaceEvenly,
            crossAxisAlignment: CrossAxisAlignment.start,
          ),
        ),
        Row(
          children: [
            Icon(
              Icons.star,
              color: Colors.yellow,
            ),
            Text('30'),
          ],
        ),
      ],
    );
    row = SizedBox(
      height: 60.0,
      child: row,
    );
    return row;
  }

  _buildThird() {
    Widget buildItem(IconData iconData, String text) {
      return Expanded(
        child: SizedBox(
          height: 50.0,
          child: Column(
            children: [
              Icon(
                iconData,
                color: Colors.blue,
              ),
              Text(
                text,
                style: TextStyle(color: Colors.blue),
              ),
            ],
            mainAxisAlignment: MainAxisAlignment.spaceEvenly,
          ),
        ),
      );
    }

    return Row(
      children: [
        buildItem(Icons.phone, '呼叫'),
        buildItem(Icons.room, '导航'),
        buildItem(Icons.share, '分享'),
      ],
    );
  }

  _buildFourth() {
    return Padding(
      padding: const EdgeInsets.all(8.0),
      child: Text(
        '这个旅游地方我也不知道是什么地方,有什么流弊的,不过看起来还不错.\n\n'
            '这篇文章就到这里基本也没啥说的了,这个是第四部分,我就把内容直接放在Widget里面了,感谢观看,后面我可能会出一个简易的FAQ,专门写一些小白问题☺☺☺☺☺',
        style: TextStyle(
          fontSize: 13.0,
        ),
      ),
    );
  }
}

你可能感兴趣的:(flutter 项目新手向结构简析)