【Flutter 1.2】手機的畫面佈局 (Container篇)

這次是要說明Flutter的畫面佈局,在Flutter的世界中,萬物皆Widget,應該在iOS中算是UIView吧?UI的根源,一切都是由此而生,話不多說,讓我們踏出成功的第一步。

Container佈局

開始寫Code

  • 首先,flutter的程式碼都是在『lib資料夾』之下

資源管理

  assets:
   - images/book.png
   - images/time.png

程式碼

// main.dart
import 'package:flutter/material.dart';
                                                          // 內容主要以iPhone的名稱去做類比
void main() => runApp(MyApp());                           // 主程式進入點

class MyApp extends StatelessWidget {                     // StatelessWidget => 沒有狀態的Widget
  @override
  Widget build(BuildContext context) {                    // build(BuildContext context) => 建立Widget => init()
    return MaterialApp(                                   // MaterialApp => Android的外形組件
      title: 'ContainerDemo',
      home: ContainerDemo(),                              // home => App的最外框 => UIViewController
    );
  }
}

class ContainerDemo extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(                                      // Scaffold => 外框 => UIContainerView
      appBar: AppBar(                                     // AppBar => 最上方標題列 => UINavigationController
        title: Text('Container範例'),                      // Text => 文字列 => UILabel
      ),
      body: containerViewMaker(),                         // body => 外框的內容
    );
  }
}

/// Widget
// 主要的外框
Widget containerViewMaker() {
  Widget container = Container(                           // Container => UIView (所有View的最低層)
    decoration: BoxDecoration(
      color: Colors.yellow,
    ),
    child: Column(                                        // Column => UIStackView (直的)
      children: <Widget>[
        Center(                                           // Center => 置中
          child: Padding(                                 // Padding => 於外框的距離
            padding: const EdgeInsets.all(8.0),
            child: Row(                                   // Row => UIStackView (橫的)
              children: <Widget>[
                Expanded(                                 // Expanded => 會盡量的擴充 (填滿)
                  child: Image.asset('images/book.png'),
                ),
                Expanded(
                  child: Image.asset('images/time.png'),
                ),
              ],
            ),
          ),
        ),
        Row(
          children: <Widget>[                               // children => Array
            Expanded(
              child: cellContainerMaker(Icon(Icons.wifi)),  // child => 一個
            ),
            Expanded(
              child: cellContainerMaker(Icon(Icons.phone)),
            ),
          ],
        ),
      ],
    ),
  );

  return container;
}

// Cell內框
Widget cellContainerMaker(Icon icon) {
  Widget container = Container(
    width: 150.0,
    height: 150.0,
    decoration: BoxDecoration(
      border: Border.all(
        width: 10.0,
        color: Colors.blueGrey,
      ),
      borderRadius: const BorderRadius.all(Radius.circular(8.0)),
    ),
    margin: const EdgeInsets.all(4.0),
    child: icon,
  );

  return container;
}

解說

結果

圖解

  • 基本的架構都在圖上了(應該標示的還好吧?),大家可以試著改改Code看看有什麼變化,細節的設定就不多做說明了(其實我也是初學者…XD)

範例程式碼下載