Flutter知識(shí)點(diǎn): Widget隱藏與顯示

在Flutter中沒有removeView,addView這種方式控制Widget Tree中的組件

場(chǎng)景: 根據(jù)狀態(tài)顯示隱藏widget

解決方案1(占位):

Widget _buildA() {
  var content;
  if (data?.isNotEmpty) {
    //如果數(shù)據(jù)不為空,則顯示Text
      content = new Text('數(shù)據(jù)不為空');
  } else {
   //當(dāng)數(shù)據(jù)為空我們需要隱藏這個(gè)Text
   //我們又不能返回一個(gè)null給當(dāng)前的Widget Tree
   //只能返回一個(gè)長(zhǎng)寬為0的widget占位
      content = new Container(height:0.0,width:0.0);
  }
  return content;
}

解決方案2(透明度):

class _HideAndShowPageState extends State<HideAndShowPage> {
bool visible = true;

@override
Widget build(BuildContext context) {
  return new Scaffold(
    appBar: new AppBar(
      title: new Text('widget顯示與隱藏'),
      centerTitle: true,
    ),
    body: new ListView(
      children: <Widget>[
        new Padding(
          padding: const EdgeInsets.only(left: 10.0, top: 10.0, right: 10.0),
          child: new RaisedButton(
              textColor: Colors.black,
              child: new Text(visible ? '隱藏B    顯示A' : '隱藏A   顯示B'),
              onPressed: () {
                visible = !visible;
                setState(() {});
              }),
        ),
        new Padding(
          padding: const EdgeInsets.only(left: 10.0, top: 10.0, right: 10.0),
          child: new Stack(
            children: <Widget>[
              new TestAWidget(
                visible: visible,
              ),
              new TestBWidget(
                visible: !visible,
              ),
            ],
          ),
        ),
      ],
    ),
  );
}
}

class TestAWidget extends StatelessWidget {
final bool visible;

const TestAWidget({Key key, this.visible}) : super(key: key);

@override
Widget build(BuildContext context) {
  return AnimatedOpacity(
    duration: Duration(milliseconds: 300),
    opacity: visible ? 1.0 : 0.0,
    child: new Container(
      color: Colors.blue,
      height: 100.0,
      child: new Center(
        child: new Text('TestAWidget'),
      ),
    ),
  );
}
}

class TestBWidget extends StatelessWidget {
final bool visible;

const TestBWidget({Key key, this.visible}) : super(key: key);

@override
Widget build(BuildContext context) {
  return AnimatedOpacity(
    duration: Duration(milliseconds: 300),
    opacity: visible ? 1.0 : 0.0,
    child: new Container(
      color: Colors.green,
      height: 100.0,
      child: new Center(
        child: new Text('TestBWidget'),
      ),
    ),
  );
}
}

解決方案3(Offstage):

class TestCWidget extends StatelessWidget {
 final bool visible;

 const TestCWidget({Key key, this.visible}) : super(key: key);

 @override
 Widget build(BuildContext context) {
   return new Offstage(
     offstage: visible,
     child:new Container(
       color: Colors.orange,
       height: 100.0,
       child: new Center(
         child: new Text('TestCWidget'),
       ),
     ),
   );
 }
}

showandhide.gif

ps:如果還有別的方案,麻煩告知下,謝謝!

已有項(xiàng)目集成到Flutter代碼已經(jīng)上傳到我的GITHUB

知乎日?qǐng)?bào)Flutter版代碼已經(jīng)上傳到我的GITHUB

基礎(chǔ)學(xué)習(xí)過程中的代碼都放在GITHUB

每天學(xué)一點(diǎn),學(xué)到Flutter發(fā)布正式版!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,552評(píng)論 25 708
  • 一日往市中心逛街,走得腿酸腳乏,胃袋空空,只想坐落吃東西。滿街食肆招牌迎風(fēng)閃亮,反叫人定不下該去何處。都說做人最怕...
    任寧閱讀 443評(píng)論 1 5
  • 獨(dú)自徘徊在悠長(zhǎng)悠長(zhǎng)又寂寥的長(zhǎng)廊 回憶著我深思的同窗死黨 清冷的夜有了思隱傷 停下的腳步 迷了彷徨 同桌死黨 上班的...
    醽醁小姐閱讀 276評(píng)論 1 8
  • 一粒孤獨(dú)的種子 在一次偶然的夢(mèng)囈中集結(jié)成玉 卻被命運(yùn)女神隨手棄于泥潭 一顆七竅玲瓏的心 不懼黑暗 不憂逆境 她有的...
    云水禪心千古情閱讀 208評(píng)論 0 1
  • 她影唯一為女孩定制的泛電影文化平臺(tái)原創(chuàng)文章,轉(zhuǎn)載需聯(lián)系公眾號(hào): 她影 herinfilm 面斥不雅 有個(gè)問題我思考...
    她影閱讀 335評(píng)論 0 1