美文网首页Flutter圈子
移动端混合开发Flutter入坑(三)综合布局

移动端混合开发Flutter入坑(三)综合布局

作者: fzkun | 来源:发表于2019-01-23 18:05 被阅读14次

    本章会介绍

    • Flutter的布局机制如何工作
    • 如何纵向和横向布置小部件
    • 如何构建Flutter布局

    GitHub代码

    image.png

    目录

    • Step 0: 创建app基础架构
    • Step 1: 分析并拆分布局
    • Step 2: 实现标题简介Row
    • Step 3: 实现按钮Row
    • Step 4: 实现文字介绍Row
    • Step 5: 实现头部图片Row
    • Step 6: 滑动手势

    Step 0:创建app基础架构

    import 'package:flutter/material.dart';
    
    void main() => runApp(MyApp());
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter layout demo',
          home: Scaffold(
            appBar: AppBar(
              title: Text('Flutter layout demo'),
            ),
            body: Center(
              child: Text('Hello World'),
            ),
          ),
        );
      }
    }
    
    image.png

    Setp 1:分析并拆分布局

    第一步是将布局分解为基本元素:

    在此示例中,四个元素排列成一列:图像,两行和一个文本块。


    image.png

    第一行标题部分,有3个Row子控件:文本模块,一个星形图标和一个数字。 它的第一个子控件Row,包含2行文本。 第一列占用了大量空间,因此必须将其包装在Expanded小部件中。


    image.png

    第二行Button部分,也有3个Column子控件:每个子控件都是一个包含图标和文本的Column。


    image.png

    Step 2: 实现标题简介Row

    class TitleSection extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return Container(
          padding: const EdgeInsets.all(32.0),
          child: Row(
            children: [
              Expanded(
                /*1*/
                child: Column(
                  crossAxisAlignment: CrossAxisAlignment.start,
                  children: [
                    /*2*/
                    Container(
                      padding: const EdgeInsets.only(bottom: 8.0),
                      child: Text(
                        'Oeschinen Lake Campground',
                        style: TextStyle(
                          fontWeight: FontWeight.bold,
                        ),
                      ),
                    ),
                    Text(
                      'Kandersteg, Switzerland',
                      style: TextStyle(
                        color: Colors.grey[500],
                      ),
                    ),
                  ],
                ),
              ),
              /*3*/
              Icon(
                Icons.star,
                color: Colors.red[500],
              ),
              Text('41'),
            ],
          ),
        );
      }
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter layout demo',
          home: Scaffold(
            appBar: AppBar(
              title: Text('Flutter layout demo'),
            ),
            body: Column(
              children: <Widget>[
                TitleSection(),
              ],
            ),
          ),
        );
      }
    }
    
    image.png

    Step 3: 实现按钮Row

    class ButtonSection extends StatelessWidget {
      Column _buildButtonColumn(Color color, IconData icon, String label) {
        return Column(
          mainAxisSize: MainAxisSize.min,
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Icon(icon, color: color),
            Container(
              margin: EdgeInsets.only(top: 8.0),
              child: Text(
                label,
                style: TextStyle(
                    fontSize: 12.0, fontWeight: FontWeight.w400, color: color),
              ),
            )
          ],
        );
      }
    
      @override
      Widget build(BuildContext context) {
        Color color = Theme.of(context).primaryColor;
        return Row(
          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
          children: <Widget>[
            _buildButtonColumn(color, Icons.call, 'CALL'),
            _buildButtonColumn(color, Icons.near_me, 'ROUTE'),
            _buildButtonColumn(color, Icons.share, 'SHARE'),
          ],
        );
      }
    }
    
    image.png

    Step 4: 实现文字介绍Row

    class TextSection extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return Container(
          margin: EdgeInsets.all(8.0),
          child: Text(
            'Lake Oeschinen lies at the foot of the Blüemlisalp in the Bernese '
                'Alps. Situated 1,578 meters above sea level, it is one of the '
                'larger Alpine Lakes. A gondola ride from Kandersteg, followed by a '
                'half-hour walk through pastures and pine forest, leads you to the '
                'lake, which warms to 20 degrees Celsius in the summer. Activities '
                'enjoyed here include rowing, and riding the summer toboggan run.',
            softWrap: true,
          ),
        );
      }
    }
    

    Step 5: 实现头部图片Row

    图片地址:
    https://images.unsplash.com/photo-1471115853179-bb1d604434e0?dpr=1&auto=format&fit=crop&w=767&h=583&q=80&cs=tinysrgb&crop=
    首先,下载图片到images/lake.jpg目录,然后在pubspec.yaml文件中加入以下代码

    flutter:
      uses-material-design: true
      assets:
        - images/lake.jpg
    

    添加代码

    class ImageSection extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return Image.asset(
          'images/lake.jpg',
          width: 600.0,
          height: 240.0,
          fit: BoxFit.cover,
        );
      }
    }
    
    image.png

    Step 6: 滑动手势

    把main方法body中一开始的Column改成ListView,如下显示,再次滑动即可。

    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter layout demo',
          home: Scaffold(
            appBar: AppBar(
              title: Text('Flutter layout demo'),
            ),
            body: ListView(
              children: <Widget>[
                ImageSection(),
                TitleSection(),
                ButtonSection(),
                TextSection(),
              ],
            ),
          ),
        );
      }
    }
    

    欢迎关注公众号IT科技互联,了解更多技术博文。

    IT科技互联

    相关文章

      网友评论

        本文标题:移动端混合开发Flutter入坑(三)综合布局

        本文链接:https://www.haomeiwen.com/subject/nvfxjqtx.html