Flutter 40: 日常問(wèn)題小結(jié) (一)

??????小菜作為一個(gè)小學(xué)生在實(shí)際操作中遇到很多問(wèn)題,相對(duì)比較常見(jiàn),小菜來(lái)整理記錄一下。

問(wèn)題一:嵌套權(quán)重異常

??????小菜做 Android 時(shí)為了屏幕適配汁咏,用到權(quán)重/比例比較多,Flutter 也提供了實(shí)現(xiàn)權(quán)重的功能作媚,小菜嘗試過(guò) 權(quán)重基本用法攘滩,當(dāng)時(shí)沒(méi)有涉及到嵌套權(quán)重的問(wèn)題,小菜想要實(shí)現(xiàn)的是左側(cè)一張大圖纸泡,右側(cè)垂直兩張小圖漂问,水平方向 1:1 均分,小菜用 Expanded 配合 flex 在嵌套權(quán)重時(shí)遇到如下問(wèn)題,于是重新研究一下權(quán)重的使用;

嘗試一:

??????在根 Widget 中嘗試如下级解,ExpandedFlexible 均正常冒黑,默認(rèn)填滿布局,與小菜預(yù)計(jì)的相同勤哗;

??????小菜理解 Container 未設(shè)置寬高抡爹,但 Row/Column 默認(rèn) mainAxisSize=MainAxisSize.max,因此正常填滿芒划;

// Expanded
return new SafeArea(
    top: false,
    child: Scaffold(
        appBar: new AppBar(
          title: Text('Expanded Demo'),
        ),
        body: Container(
            child: Row(children: <Widget>[
          Expanded(flex: 1, child: Container(color: Colors.red)),
          Expanded(flex: 1,
              child: Column(children: <Widget>[
                Expanded(flex: 1, child: Container(color: Colors.blue)),
                Expanded(flex: 1, child: Container(color: Colors.green))
              ]))
        ]))));

// Flexible
return new SafeArea(
    top: false,
    child: Scaffold(
        appBar: new AppBar(
          title: Text('Flexible Demo'),
        ),
        body: Container(
            child: Row(children: <Widget>[
          Flexible(flex: 1, child: Container(color: Colors.red)),
          Flexible(
              flex: 1,
              child: Column(children: <Widget>[
                Flexible(flex: 1, child: Container(color: Colors.blue)),
                Flexible(flex: 1, child: Container(color: Colors.green))
              ]))
        ]))));

嘗試二:

??????大多數(shù)情況頁(yè)面元素較多冬竟,最外層可能會(huì)嵌套 ListView/Column 或其他 Widget,此時(shí)用 Expanded 便會(huì)出現(xiàn)如上問(wèn)題民逼;日志中建議使用 FlexibleColumn mainAxisSize: MainAxisSize.min泵殴,雖然不報(bào)錯(cuò),但是頁(yè)面空白無(wú)效果拼苍;若只用 Flexible 結(jié)果依然是上述問(wèn)題笑诅;

??????小菜理解兩層 Column 加上 Expanded/Flexible 無(wú)法計(jì)算 Container 高度,子 Widget 無(wú)法自適應(yīng)父 Widget 高度疮鲫;

return new SafeArea(
    top: false,
    child: Scaffold(
        body: ListView(children: <Widget>[
      Container(
          child: Row(children: <Widget>[
        Flexible(flex: 1, child: Container(color: Colors.red)),
        Flexible(
            flex: 1,
            child: Column(
                mainAxisAlignment: MainAxisAlignment.start,
                mainAxisSize: MainAxisSize.min,
                crossAxisAlignment: CrossAxisAlignment.center,
                children: <Widget>[
                  Flexible(flex: 1, child: Container(color: Colors.blue)),
                  Flexible(flex: 1, child: Container(color: Colors.green))
                ]))
      ]))
    ])));

嘗試三:

??????根據(jù)上一步嘗試吆你,小菜理解 Container 高度為 0,需要手動(dòng)設(shè)置高度俊犯,但是設(shè)置在 Row 層還是 Column 層或子 Container 層是不同的妇多;

??????小菜理解不顯示的原因是高度未匹配,故嘗試不同位置設(shè)置默認(rèn)高度燕侠,但基本都在最外層設(shè)置并以最外層為基準(zhǔn)者祖;

return new SafeArea(
    top: false,
    child: Scaffold(
        body: ListView(children: <Widget>[
          Container(
              height: 120,
              child: Row(children: <Widget>[
                Flexible(flex: 1, child: Container(color: Colors.red)),
                Flexible( flex: 1,
                    child: Container(
                        child: Column(
                            mainAxisAlignment: MainAxisAlignment.start,
                            mainAxisSize: MainAxisSize.min,
                            crossAxisAlignment: CrossAxisAlignment.center,
                            children: <Widget>[
                          Flexible( flex: 1, child: Container(color: Colors.blue)),
                          Flexible( flex: 1, child: Container(color: Colors.green))
                        ])))
              ]))
        ])));

嘗試四:

??????如果最外層不設(shè)置高度時(shí),則考慮根據(jù)需求使用帶有寬高的 Widget绢彤,小菜需要展示圖片七问,故直接用圖片占位;
??????小菜主要想實(shí)現(xiàn)圖片高度自適應(yīng)茫舶,而寬度隨屏幕比例占有烂瘫,右側(cè)兩圖正常為左圖占位一半,但為了防止異常奇适,通常在最外層設(shè)置高度;

return new SafeArea(
    top: false,
    child: Scaffold(
        body: ListView(children: <Widget>[
          Container(
              child: Row(children: <Widget>[
            Expanded(
                flex: 1,
                child: Image.network(
                    'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1544938569112&di=feeab11968f3870520482630563c4f54&imgtype=0&src=http%3A%2F%2Fi1.hdslb.com%2Fbfs%2Farchive%2Fac5c906111130579c6909aae47f6656e20d0906b.jpg')),
            Expanded(
                flex: 1,
                child: Container(
                    child: Column(
                        mainAxisAlignment: MainAxisAlignment.start,
                        mainAxisSize: MainAxisSize.min,
                        crossAxisAlignment: CrossAxisAlignment.center,
                        children: <Widget>[
                      Flexible(
                          child: Image.network(
                              'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1544938569112&di=feeab11968f3870520482630563c4f54&imgtype=0&src=http%3A%2F%2Fi1.hdslb.com%2Fbfs%2Farchive%2Fac5c906111130579c6909aae47f6656e20d0906b.jpg'),
                          flex: 1),
                      Flexible(
                          child: Image.network(
                              'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1544938569112&di=feeab11968f3870520482630563c4f54&imgtype=0&src=http%3A%2F%2Fi1.hdslb.com%2Fbfs%2Farchive%2Fac5c906111130579c6909aae47f6656e20d0906b.jpg'),
                          flex: 1)
                    ])))
          ]))
        ])));

擴(kuò)展:

??????FlexibleFlexFit 分兩種芦鳍,在嵌套權(quán)重時(shí)只可以用默認(rèn)的 loose嚷往,在其他情況下,小菜測(cè)試差別不大柠衅;但小菜理解的官方說(shuō)明:tight 模式是強(qiáng)制填補(bǔ)剩余空間皮仁,而 loose 模式可以填滿剩余空間,也允許稍小不填滿,非強(qiáng)制贷祈;相對(duì) loose 使用范圍更廣趋急。

問(wèn)題二:SnackBar 找不到 Context

??????小菜嘗試 SnackBar 時(shí)總是找不到上下文環(huán)境而打不開(kāi);

嘗試一:

??????小菜將整體放在一個(gè) Widget 中势誊,傳入 BuildContext 參數(shù)呜达,無(wú)果,依舊是找不到上下文環(huán)境粟耻;

嘗試二:

??????按官網(wǎng)推薦查近,可新建一個(gè) Builder 動(dòng)態(tài)添加 BuildContext,但是小菜又出現(xiàn)新的問(wèn)題挤忙,不可在 Builder 中返回?zé)o大小的 Container霜威;仔細(xì)找了很久發(fā)現(xiàn) Builder 需要 return 一個(gè) Widget,太粗心册烈;

Widget _childExpandedWid() {
  return SafeArea(
      top: false,
      child: Scaffold(
          appBar: new AppBar(title: new Text("SnackBar Demo")),
          body: Builder(builder: (BuildContext context) {
            return Row(children: <Widget>[
              Expanded(
                  flex: 1,
                  child: GestureDetector(
                      onTap: () {
                        Scaffold.of(context).showSnackBar(
                            SnackBar(content: Text('測(cè)試一下 SnackBar 使用戈泼!')));
                      },
                      child: Container(color: Colors.red))),
              Expanded(
                  flex: 1,
                  child: Column(children: <Widget>[
                    Expanded(flex: 1, child: Container(color: Colors.blue)),
                    Expanded(flex: 1, child: Container(color: Colors.green))
                  ]))
            ]);
          })));
}

嘗試三:

??????按官網(wǎng)推薦,可以將這些子 Widget 拆分為單獨(dú)的 StatelessWidget 組件赏僧,測(cè)試正常大猛;

class ChildExpandWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return SafeArea(
        top: false,
        child: Scaffold(
            appBar: new AppBar(title: new Text("SnackBar Demo")),
            body: Row(children: <Widget>[
              Expanded(
                  flex: 1,
                  child: GestureDetector(
                      onTap: () {
                        Scaffold.of(context).showSnackBar(
                            SnackBar(content: Text('測(cè)試一下 SnackBar 使用!')));
                      },
                      child: Container(color: Colors.red))),
              Expanded(
                  flex: 1,
                  child: Column(children: <Widget>[
                    Expanded(flex: 1, child: Container(color: Colors.blue)),
                    Expanded(flex: 1, child: Container(color: Colors.green))
                  ]))
            ])));
  }
}

??????小菜作為初學(xué)者次哈,遇到很多基礎(chǔ)的問(wèn)題胎署,僅做記錄;如有錯(cuò)誤請(qǐng)多多指導(dǎo)窑滞!

來(lái)源:阿策小和尚

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末琼牧,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子哀卫,更是在濱河造成了極大的恐慌巨坊,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件此改,死亡現(xiàn)場(chǎng)離奇詭異趾撵,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)共啃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門占调,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人移剪,你說(shuō)我怎么就攤上這事究珊。” “怎么了纵苛?”我有些...
    開(kāi)封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵剿涮,是天一觀的道長(zhǎng)言津。 經(jīng)常有香客問(wèn)我,道長(zhǎng)取试,這世上最難降的妖魔是什么悬槽? 我笑而不...
    開(kāi)封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮瞬浓,結(jié)果婚禮上初婆,老公的妹妹穿的比我還像新娘。我一直安慰自己瑟蜈,他們只是感情好烟逊,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著铺根,像睡著了一般宪躯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上位迂,一...
    開(kāi)封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天访雪,我揣著相機(jī)與錄音,去河邊找鬼掂林。 笑死臣缀,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的泻帮。 我是一名探鬼主播精置,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼锣杂!你這毒婦竟也來(lái)了脂倦?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤元莫,失蹤者是張志新(化名)和其女友劉穎赖阻,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體踱蠢,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡火欧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了茎截。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片苇侵。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖企锌,靈堂內(nèi)的尸體忽然破棺而出衅檀,到底是詐尸還是另有隱情,我是刑警寧澤霎俩,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布哀军,位于F島的核電站,受9級(jí)特大地震影響打却,放射性物質(zhì)發(fā)生泄漏杉适。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一柳击、第九天 我趴在偏房一處隱蔽的房頂上張望猿推。 院中可真熱鬧,春花似錦捌肴、人聲如沸蹬叭。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)秽五。三九已至,卻和暖如春饥悴,著一層夾襖步出監(jiān)牢的瞬間坦喘,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工西设, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瓣铣,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓贷揽,卻偏偏與公主長(zhǎng)得像棠笑,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子禽绪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

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

  • 配置mac版mysql: 1.打開(kāi)終端蓖救,cd ~ 2.輸入命令: open .bash_profile 3.修改打...
    d76d0c9d2b04閱讀 167評(píng)論 0 0
  • 這些年讓蘇公公看不透的人沒(méi)有幾個(gè),在皇上身邊當(dāng)了這么多年的差丐一,皇上身邊個(gè)個(gè)人精藻糖,但是自從皇上西去以后,這皇后當(dāng)上了...
    長(zhǎng)羮閱讀 152評(píng)論 4 1