iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 15
1
Mobile Development

30天手滑用Google Flutter解鎖Hybrid App成就系列 第 15

30天Flutter手滑系列 - 井字遊戲實作(Tic Tac Toe)(2)

接續前一天的進度30天Flutter手滑系列 - 井字遊戲實作(Tic Tac Toe) - 導論與基本佈局的進度。

持續優化布局

回顧昨天使用了Expanded,讓GridView可以順利在Column內顯示,但同時也把開始的按鈕擠到畫面最下方,如圖。
https://ithelp.ithome.com.tw/upload/images/20190922/20120028EHdrJPsUrh.png

Widget解說

這是因為Expanded是用來填滿ColumnRow或是Flex的子Child的Widget,它會自己填滿主軸中可用的所有可用空間。

有沒有更好的方法?有的,我們可以使用GridView內的shrinkWrap。這個屬性會讓其內容只占據畫面上所需要的大小。

  • shrinkWrap = false;
    https://ithelp.ithome.com.tw/upload/images/20190922/20120028j7oXBgr6zG.png

  • shrinkWrap = true;
    https://ithelp.ithome.com.tw/upload/images/20190922/20120028rH6cCHoFE9.png

加入shrinkWrap後我們的畫面會變成如下:
https://ithelp.ithome.com.tw/upload/images/20190922/20120028uhAFIYioPx.png

產生GridView內的child

在原本的Code,我們先用了9個Icon Widgets去暫時擺放在九宮格內,如果要簡化它,我們可以用List.generate()這個方法。

List.generate用法

List.generate(欲產生的個數, index索引值)

List.generate這個方法,需要回傳欲產生的內容,這邊我回傳內含FlatButtonContainer
Container的目的是為了加入padding去產生空白的部分。
FlatButton的部分,設置了背景色與文字顏色。
由於文字的樣式也是一個Widget,所以添加style,才能調整其樣式。

小提示

如果想要讓Button有顏色的話,必須添加onPressed: () {},否則是沒有效果的,因為預設是disabled

class _TicTacToePageState extends State<TicTacToePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Column(
        mainAxisAlignment: MainAxisAlignment.spaceEvenly,
        children: <Widget>[
          GridView.count(
              crossAxisCount: 3,
              shrinkWrap: true,
              children: List.generate(9, (index) {  // 產生9個子child
                return Container(
                  padding: EdgeInsets.all(8.0),   // 加入padding,產生留白處
                  child: FlatButton(
                    child: Text(
                      "X",
                      style: TextStyle(fontSize: 50.0),  // 調整文字大小
                    ),
                    color: Colors.grey,  // 設置背景色
                    textColor: Colors.white,  // 設置文字顏色
                    onPressed: () {},  // enable按鈕
                  ),
                );
              })),
          Center(
            child: ButtonTheme(
              minWidth: 200,
              height: 80,
              child: RaisedButton(
                color: Colors.blue,
                child: Text('Start Game'),
                onPressed: null,
              ),
            ),
          )
        ],
      ),
    );
  }
}

https://ithelp.ithome.com.tw/upload/images/20190922/20120028HXIE0v5yvV.png

加入按鈕行為

這邊目前卡關,我想做點擊按鈕後,再把文字填入,今天應該來不及了,明日繼續。


總結

下面章節,預定加入狀態管理去控制九宮格的點擊,順利的話也許可以進到遊戲開始的部分。


參考資料

https://juejin.im/post/5ccef90d6fb9a03217283221
https://stackoverflow.com/questions/54007073/what-does-the-shrink-wrap-property-do-in-flutter
https://flutter.dev/docs/cookbook/lists/grid-lists


上一篇
30天Flutter手滑系列 - 井字遊戲實作(Tic Tac Toe) (1)
下一篇
30天Flutter手滑系列 - 井字遊戲實作(Tic Tac Toe)(3)
系列文
30天手滑用Google Flutter解鎖Hybrid App成就30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言