iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 4
0
自我挑戰組

使用flutter建構Android和iOs APP系列 第 4

規劃檔案結構與state1 - main和product_manager

  • 分享至 

  • xImage
  •  

接下來,為了讓code不要太長,決定來切分檔案架構,會新增這些檔案

lib
- main.dart
- product_control.dart
- product_manager.dart
- products.dart

https://ithelp.ithome.com.tw/upload/images/20181004/20111840Jci21lZrgW.png

https://ithelp.ithome.com.tw/upload/images/20181004/20111840larXj3Ev8K.jpg

  1. main.dart
import 'package:flutter/material.dart'; 
import './product_manager.dart'; //引入寫好的檔案

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget{
  @override
  Widget build(BuildContext context) { 
    return MaterialApp(
      theme: ThemeData(
        primarySwatch: Colors.deepOrange, //定義primary的顏色
        accentColor: Colors.deepPurple //定義提示顏色
      ),
      home : Scaffold( 
        appBar: AppBar( 
          title : Text('我的APP')
        ),
        body: ProductManager(startingProduct : 'test')
      )
    ); 
  }
}
  1. product_manager.dart
import 'package:flutter/material.dart';
import './products.dart'; 
import './product_control.dart'; 

class ProductManager extends StatefulWidget {
  //StatefulWidget是會隨著資料改變而改變UI的組建
  final String startingProduct;
  //定義一個string變數
  ProductManager({ this.startingProduct});
  //建構函式,可以從他爸那邊拿值進來用
  //(就是main.dart的ProductManager後面的小括號)
  @override
    State<StatefulWidget> createState() { 
    //createState方法會回傳一個state組件
      return _ProductManagerState(); 
      //上述的組件就是這個
    }
}

class _ProductManagerState extends State<ProductManager> { 
  //state組件是ProductManager這個StatefulWidget的State
  final List<String> _products = [];
  //因為他不會再被assign,所以加final
  void initState() {
    //初始化一個state,不會回傳值(是flutter裡面的一個生命週期) 
    super.initState();
    //下面的程式若想要蓋掉初始值,就要呼叫super
    if(widget.startingProduct != null){
      _products.add(widget.startingProduct); 
      //把最外層的值放進來,此例就變成['test']
    }
  }
  void _addProduct(String product) {
    setState(() { 
      //一個可以改變state的function,限制只能傳string進來
      _products.add(product);
    });
  }
  @override
  Widget build(BuildContext context) {
    //build函式才會真正把內容放到UI上
      return Column(
          children: [
            Container(
              margin: EdgeInsets.all(10.0),
              child: ProductControl(_addProduct)
              //裡面含有一個按鈕,然後我們把函式放進去,讓裡面的按鈕可以使用
            ),
            Expanded(child : Products(_products))
            //Expanded是個就算內容爆出手機長度,也可以產生捲軸的組件
            //裡面是整個商品列表
          ]
        );
    }
}

主題來源:
Learn Flutter & Dart to Build iOS & Android Apps


上一篇
使用陣列的map方法去跑卡片清單
下一篇
規劃檔案結構與state2 - product_control和products
系列文
使用flutter建構Android和iOs APP25
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言