成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

【Flutter】開發(fā)之進(jìn)階Widget(三)

Awbeci / 723人閱讀

摘要:頁面銷毀時,銷毀控制器在中聲明省略省略在中使用省略省略擴(kuò)展底部可以使用的屬性你的認(rèn)可,是我堅(jiān)持更新博客的動力,如果覺得有用,就請點(diǎn)個贊,謝謝

前言

在上一篇中,我們了解了常用的Widget,這一篇,我們從實(shí)際案例出發(fā),來深入學(xué)習(xí)下Widget。

案例1 模擬登陸

先看效果圖

1.我們需要2個輸入框,1個按鈕 這里用到的都是之前說過的Widget,就直接貼代碼了,建議先看這篇【Flutter】開發(fā)之基礎(chǔ)Widget(二)

class LoginDemo extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("LoginDemo"),
      ),
      body: Container(
        margin: EdgeInsets.all(15),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.start,
          children: [
            Padding(
              padding: EdgeInsets.only(top: 100),
            ),
            TextField(
              decoration: InputDecoration(
                  hintText: "請輸入賬戶",
                  hintStyle: TextStyle(color: Colors.black45),
                  contentPadding: EdgeInsets.all(10),
                  border: OutlineInputBorder(
                    borderRadius: BorderRadius.circular(4),
                  )),
            ),
            Padding(
              padding: EdgeInsets.only(top: 15),
            ),
            TextField(
              //顯示*號
              obscureText: true,
              decoration: InputDecoration(
                  hintText: "請輸入密碼",
                  hintStyle: TextStyle(color: Colors.black45),
                  contentPadding: EdgeInsets.all(10),
                  border: OutlineInputBorder(
                    borderRadius: BorderRadius.circular(4),
                  )),
            ),
            Padding(
              padding: EdgeInsets.only(top: 50),
            ),
            FlatButton(
              child: ClipRRect(
                borderRadius: BorderRadius.all(Radius.circular(10)),
                child: Container(
                  height: 50,
                  width: 300,
                  decoration: BoxDecoration(color: Colors.deepOrangeAccent),
                  alignment: AlignmentDirectional.center,
                  child: Text(
                    "登錄",
                    style: TextStyle(
                      fontSize: 18,
                      color: Colors.white,
                      backgroundColor: Colors.deepOrangeAccent,
                    ),
                  ),
                ),
              ),
            )
          ],
        ),
      ),
    );
  }
}

2.需要獲取輸入的內(nèi)容

這里有2個方法

1). 處理?onChanged回調(diào)

        TextField(
            //文字改變時調(diào)用
            onChanged: (String content) {
              print("content=" + content);
            }

2). 提供一個TextEditingController

TextEditingController user = new TextEditingController();
        TextField(
         ...省略...
              controller: user ,
         ...省略...
          )

然后通過user.text方法即可取得輸入內(nèi)容。

3.點(diǎn)擊事件

1).可以通過onPressed實(shí)現(xiàn)

            FlatButton(
              onPressed: () {
                //顯示彈窗
                _showDialog(context);
              })

注:Flutter 的語法是 Dart,Dart 不像 Java ,沒有關(guān)鍵詞 publicprivate 等修飾符,_ 下橫線代表 private ,但是有 @protected 注解。 然后,我們需要判斷密碼是否大于6位,如不是,彈窗提示

  void _showDialog(BuildContext context) {
    if (pwd.text.length < 6) {
      showDialog(
        context: context,
        builder: (BuildContext content) {
          return AlertDialog(
            title: Text("提示"),
            content: Text("輸入的密碼不能小于6位"),
          );
        },
      );
    }
}

正常的邏輯來說,彈出窗中應(yīng)該有按鈕,點(diǎn)擊重新輸入,但是卻發(fā)現(xiàn),有的Widget沒有點(diǎn)擊事件,這時,我們可以通過在外面嵌套GestureDetector來處理,GestureDetector還有更多的功能,這個我們后面再說 2).嵌套GestureDetector

  void _showDialog(BuildContext context) {
    if (pwd.text.length < 6) {
      showDialog(
        context: context,
        builder: (BuildContext content) {
          return AlertDialog(
            title: Text("提示"),
            content: Text("輸入的密碼不能小于6位"),
            actions: [
              GestureDetector(
                child: Container(
                  child: Text("重新輸入"),
                ),
                onTap: () {
                  pwd.clear();
                  //關(guān)閉彈窗
                  Navigator.of(context).pop();
                },
              ),
            ],
          );
        },
      );
    }
  }
案例2 Table 頁

先看效果圖

1.TabBar 上半部分使用的是AppBar+TabBar,詳細(xì)代碼如下:

 @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text("TableDemo"),
          bottom: TabBar(
            //可以滑動
            isScrollable: true,
            //邊距
            labelPadding: EdgeInsets.only(right: 0),
            //顏色
            labelColor: Colors.orangeAccent,
            //樣式 選中的
            labelStyle: TextStyle(fontSize: 18),
            //點(diǎn)擊事件
            onTap: (index) {
              
            },
            //未選中的顏色
            unselectedLabelColor: Colors.pink,
            //未選中樣式
            unselectedLabelStyle: TextStyle(fontSize: 14),
            //指示器的寬度
            indicatorSize: TabBarIndicatorSize.tab,
            //指示器顏色
            indicatorColor: Colors.amber,
            //指示器高度
            indicatorWeight: 2,

            tabs: [
              Container(
                width: 100,
                height: 40,
                child: Center(
                  child: Text("MODEL 1"),
                ),
              ),
              Container(
                width: 100,
                height: 40,
                child: Center(
                  child: Text("MODEL 2"),
                ),
              ),
              Container(
                width: 100,
                height: 40,
                child: Center(
                  child: Text("MODEL 3"),
                ),
              ),
            ],
          ),
        ),
  }

2.PageView

用法類似于ListView

PageView.builder

PageView.custom

PageView.builder(
        itemBuilder: (BuildContext context, int index) {
          return Container(
            child: Center(
              child: Text("PAGE ${index}"),
            ),
          );
        },
        itemCount: 5,
        onPageChanged: (indext) {},
      ),

方便起見,我們這里使用的是children

  Widget _pageView() {
    return PageView(
      children: [
        Container(
          color: Colors.blue,
          alignment: AlignmentDirectional.center,
          child: Text("PAGE 1"),
        ),
        Container(
          color: Colors.deepPurpleAccent,
          alignment: AlignmentDirectional.center,
          child: Text("PAGE 2"),
        ),
        Container(
          color: Colors.lightGreen,
          alignment: AlignmentDirectional.center,
          child: Text("PAGE 3"),
        ),
      ],
      onPageChanged: (index) {
   
      },
    );
  }

3.TabBarPageView 聯(lián)動

PageView的控制使用的是PageController

1).初始化

PageController pageController = new PageController();

2).在PageView中聲明

PageView(
            ...省略...
      controller: pageController,
            ...省略...
)

3).在TabBar中使用

      TabBar(
            ...省略...
            //點(diǎn)擊事件
            onTap: (index) {
              pageController.jumpToPage(index);
            },
             ...省略...
      )

TabBar的控制使用的是TabController

需要注意

我們的父級Widget必須是繼承StatefulWidget;需要實(shí)現(xiàn)SingleTickerProviderStateMixin

1).初始化

class TableDemo extends StatefulWidget {
  @override
  _TableDemoState createState() => _TableDemoState();
}

class _TableDemoState extends State<TableDemo>
    with SingleTickerProviderStateMixin {
  TabController _tabController;

  @override
  void initState() {
    super.initState();

    ///初始化時創(chuàng)建控制器
    ///通過 with SingleTickerProviderStateMixin 實(shí)現(xiàn)動畫效果。
    _tabController = new TabController(vsync: this, length: 3);
  }

  @override
  void dispose() {
    ///頁面銷毀時,銷毀控制器
    _tabController.dispose();
    super.dispose();
  }
}

2).在TabBar中聲明

TabBar(
            ...省略...
      controller: _tabController,
            ...省略...
)

3).在PageView中使用

      PageView(
            ...省略...
      onPageChanged: (index) {
        _tabController.animateTo(index);
      },
             ...省略...
      )

4.擴(kuò)展 底部Table 可以使用ScaffoldbottomNavigationBar屬性

  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("TableDemo"),
      ),
      body: _pageView(),
      bottomNavigationBar: Container(
        height: 40,
        child: Center(
          child: _tabView(),
        ),
      ),
    );
  }
你的認(rèn)可,是我堅(jiān)持更新博客的動力,如果覺得有用,就請點(diǎn)個贊,謝謝

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/7310.html

相關(guān)文章

  • 計(jì)劃在2021年進(jìn)行響應(yīng)式開發(fā)?但不確定應(yīng)該選擇哪種技術(shù)來快速且低成本的開發(fā)應(yīng)用程序?一文給你解決問

    摘要:與此同時,因新冠疫情的影響使得用戶對移動應(yīng)用程序的需求激增。調(diào)查報(bào)告顯示年移動應(yīng)用程序已經(jīng)產(chǎn)生了億美元的收入,預(yù)計(jì)到年將產(chǎn)生億美元的收入。 引言 計(jì)劃在2021年進(jìn)...

    Codeing_ls 評論0 收藏0
  • Flutter是跨平臺開發(fā)終極選嗎?Android開發(fā)該如何快速上手Flutter?

    摘要:月日,谷歌正式發(fā)布了的。到底能不能成為跨平臺開發(fā)終極之選是基于前端誕生的,但是對前端開發(fā)來說,的環(huán)境配置很麻煩,需要原生的平臺知識,還要擔(dān)心遇上網(wǎng)絡(luò)問題?,F(xiàn)在已經(jīng)不是曾經(jīng)的小眾框架,這兩年里它已經(jīng)逐步成長為主流的跨平臺開發(fā)框架之一。 ...

    luckyyulin 評論0 收藏0
  • Flutter開發(fā)實(shí)戰(zhàn)Widget(四)

    摘要:開發(fā)之目錄頁面跳轉(zhuǎn)的頁面跳轉(zhuǎn),主要是通過來實(shí)現(xiàn),類似原生中的路由,分為靜態(tài)和動態(tài)種方式。添加添加,這時,就可以這樣使用你的認(rèn)可,是我堅(jiān)持更新博客的動力,如果覺得有用,就請點(diǎn)個贊,謝謝 前言 這一篇,我們說說開發(fā)中會用到的地方。 【Flutter】開發(fā)之目錄 頁面跳轉(zhuǎn) Flutter的頁面跳轉(zhuǎn),主要是通過Navigator來實(shí)現(xiàn),類似原生中的路由,分為靜態(tài)和動態(tài)2種方式。 靜態(tài) 首先...

    funnyZhang 評論0 收藏0
  • Flutter基礎(chǔ)(二)Flutter最新開發(fā)環(huán)境搭建和Hello World

    摘要:注釋處的方法是程序的入口,使用了符號,這是中單行函數(shù)或方法的簡寫,等價于如下代碼方法是框架的入口,如果不返回方法,那么執(zhí)行的是一個控制臺應(yīng)用。 本文首發(fā)于微信公眾號「劉望舒」 前言 最近的Google I/O大會上,F(xiàn)lutter1.5 開始支持移動、Web、桌面和嵌入式設(shè)備,從不溫不火的sky一直進(jìn)化到如今熱門的Flutter,F(xiàn)lutter的發(fā)展已經(jīng)超出很多人的想象。我對跨平臺技術(shù)一...

    tuomao 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<