關(guān)于StackOverflow Flutter 的這個問題奥此,這一篇就夠了

如何實現(xiàn)Android平臺的wrap_content 和match_parent

你可以按照如下方式實現(xiàn):

1用踩、Width = Wrap_content Height=Wrap_content:

Wrap(
  children: <Widget>[your_child])

2悼潭、Width = Match_parent Height=Match_parent:

Container(
        height: double.infinity,
    width: double.infinity,child:your_child)

3潮酒、Width = Match_parent ,Height = Wrap_conten:

Row(
  mainAxisSize: MainAxisSize.max,
  children: <Widget>[*your_child*],
);

4坟冲、Width = Wrap_content ,Height = Match_parent:

Column(
  mainAxisSize: MainAxisSize.max,
  children: <Widget>[your_child],
);

如何避免FutureBuilder頻繁執(zhí)行future方法

錯誤用法:

@override
Widget build(BuildContext context) {
  return FutureBuilder(
    future: httpCall(),
    builder: (context, snapshot) {
     
    },
  );
}

正確用法:

class _ExampleState extends State<Example> {
  Future<int> future;

  @override
  void initState() {
    future = Future.value(42);
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return FutureBuilder(
      future: future,
      builder: (context, snapshot) {
       
      },
    );
  }
}

底部導(dǎo)航切換導(dǎo)致重建問題

在使用底部導(dǎo)航時經(jīng)常會使用如下寫法:

Widget _currentBody;

@override
Widget build(BuildContext context) {
  return Scaffold(
    body: _currentBody,
    bottomNavigationBar: BottomNavigationBar(
      items: <BottomNavigationBarItem>[
        ...
      ],
      onTap: (index) {
        _bottomNavigationChange(index);
      },
    ),
  );
}

_bottomNavigationChange(int index) {
  switch (index) {
    case 0:
      _currentBody = OnePage();
      break;
    case 1:
      _currentBody = TwoPage();
      break;
    case 2:
      _currentBody = ThreePage();
      break;
  }
  setState(() {});
}

此用法導(dǎo)致每次切換時都會重建頁面磨镶。

解決辦法,使用IndexedStack:

int _currIndex;

@override
Widget build(BuildContext context) {
  return Scaffold(
    body: IndexedStack(
        index: _currIndex,
        children: <Widget>[OnePage(), TwoPage(), ThreePage()],
      ),
    bottomNavigationBar: BottomNavigationBar(
      items: <BottomNavigationBarItem>[
        ...
      ],
      onTap: (index) {
        _bottomNavigationChange(index);
      },
    ),
  );
}

_bottomNavigationChange(int index) {
  setState(() {
      _currIndex = index;
    });
}

TabBar切換導(dǎo)致重建(build)問題

通常情況下健提,使用TabBarView如下:

TabBarView(
  controller: this._tabController,
  children: <Widget>[
    _buildTabView1(),
    _buildTabView2(),
  ],
)

此時切換tab時琳猫,頁面會重建,解決方法設(shè)置PageStorageKey:

var _newsKey = PageStorageKey('news');
var _technologyKey = PageStorageKey('technology');

TabBarView(
  controller: this._tabController,
  children: <Widget>[
    _buildTabView1(_newsKey),
    _buildTabView2(_technologyKey),
  ],
)

Stack 子組件設(shè)置了寬高不起作用

在Stack中設(shè)置100x100紅色盒子矩桂,如下:

Center(
  child: Container(
    height: 300,
    width: 300,
    color: Colors.blue,
    child: Stack(
      children: <Widget>[
        Positioned.fill(
          child: Container(
            height: 100,
            width: 100,
            color: Colors.red,
          ),
        )
      ],
    ),
  ),
)

此時紅色盒子充滿父組件沸移,解決辦法,給紅色盒子組件包裹Center侄榴、Align或者UnconstrainedBox雹锣,代碼如下:

Positioned.fill(
  child: Align(
    child: Container(
      height: 100,
      width: 100,
      color: Colors.red,
    ),
  ),
)
如何在State類中獲取StatefulWidget控件的屬性
class Test extends StatefulWidget {
  Test({this.data});
  final int data;
  @override
  State<StatefulWidget> createState() => _TestState();
}

class _TestState extends State<Test>{

}

如下,如何在_TestState獲取到Test的data數(shù)據(jù)呢:

在_TestState也定義同樣的參數(shù)癞蚕,此方式比較麻煩蕊爵,不推薦。
直接使用widget.data(推薦)桦山。

default value of optional parameter must be constant

上面的異常在類構(gòu)造函數(shù)的時候會經(jīng)常遇見攒射,如下面的代碼就會出現(xiàn)此異常:

class BarrageItem extends StatefulWidget {
  BarrageItem(
      { this.text,
      this.duration = Duration(seconds: 3)});
      

異常信息提示:可選參數(shù)必須為常量,修改如下:

const Duration _kDuration = Duration(seconds: 3);

class BarrageItem extends StatefulWidget {
  BarrageItem(
      {this.text,
      this.duration = _kDuration});

定義一個常量恒水,Dart中常量通常使用k開頭会放,_表示私有,只能在當(dāng)前包內(nèi)使用钉凌,別問我為什么如此命名咧最,問就是源代碼中就是如此命名的。

如何移除debug模式下右上角“DEBUG”標(biāo)識

MaterialApp(
 debugShowCheckedModeBanner: false
)

如何使用16進制的顏色值

下面的用法是無法顯示顏色的:

Color(0xb74093)

因為Color的構(gòu)造函數(shù)是ARGB,所以需要加上透明度矢沿,正確用法:

Color(0xFFb74093)

FF表示完全不透明滥搭。

如何改變應(yīng)用程序的icon和名稱

如何給TextField設(shè)置初始值

class _FooState extends State<Foo> {
  TextEditingController _controller;

  @override
  void initState() {
    super.initState();
    _controller = new TextEditingController(text: '初始值');
  }

  @override
  Widget build(BuildContext context) {
    return TextField(
          controller: _controller,
        );
  }
}

Scaffold.of() called with a context that does not contain a Scaffold

Scaffold.of()中的context沒有包含在Scaffold中,如下代碼就會報此異常:

class HomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('老孟'),
      ),
      body: Center(
        child: RaisedButton(
          color: Colors.pink,
          textColor: Colors.white,
          onPressed: _displaySnackBar(context),
          child: Text('show SnackBar'),
        ),
      ),
    );
  }
}

_displaySnackBar(BuildContext context) {
  final snackBar = SnackBar(content: Text('老孟'));
  Scaffold.of(context).showSnackBar(snackBar);
}

注意此時的context是HomePage的捣鲸,HomePage并沒有包含在Scaffold中瑟匆,所以并不是調(diào)用在Scaffold中就可以,而是看context栽惶,修改如下:

_scaffoldKey.currentState.showSnackBar(snackbar); 

或者:

Scaffold(
    appBar: AppBar(
        title: Text('老孟'),
    ),
    body: Builder(
        builder: (context) => 
            Center(
            child: RaisedButton(
            color: Colors.pink,
            textColor: Colors.white,
            onPressed: () => _displaySnackBar(context),
            child: Text('老孟'),
            ),
        ),
    ),
);

Waiting for another flutter command to release the startup lock

在執(zhí)行flutter命令時經(jīng)常遇到上面的問題愁溜,

解決辦法一:

1、Mac或者Linux在終端執(zhí)行如下命令:

killall -9 dart

2媒役、Window執(zhí)行如下命令:

taskkill /F /IM dart.exe

解決辦法二:

刪除flutter SDK的目錄下/bin/cache/lockfile文件祝谚。

無法調(diào)用setState

不能在StatelessWidget控件中調(diào)用了,需要在StatefulWidget中調(diào)用酣衷。

設(shè)置當(dāng)前控件大小為父控件大小的百分比

1交惯、使用FractionallySizedBox控件

2、獲取父控件的大小并乘以百分比:

MediaQuery.of(context).size.width * 0.5

Row直接包裹TextField異常:BoxConstraints forces an infinite width

解決方法:

Row(
    children: <Widget>[
        Flexible(
            child: new TextField(),
        ),
  ],
),

TextField 動態(tài)獲取焦點和失去焦點
獲取焦點:

FocusScope.of(context).requestFocus(_focusNode);
_focusNode為TextField的focusNode:

_focusNode = FocusNode();

TextField(
    focusNode: _focusNode,
    ...
)

失去焦點:

_focusNode.unfocus();

如何判斷當(dāng)前平臺

import 'dart:io' show Platform;

if (Platform.isAndroid) {
  // Android-specific code
} else if (Platform.isIOS) {
  // iOS-specific code
}

平臺類型包括:

Platform.isAndroid
Platform.isFuchsia
Platform.isIOS
Platform.isLinux
Platform.isMacOS
Platform.isWindows
Android無法訪問http
其實這本身不是Flutter的問題穿仪,但在開發(fā)中經(jīng)常遇到席爽,在Android Pie版本及以上和IOS 系統(tǒng)上默認(rèn)禁止訪問http,主要是為了安全考慮啊片。

Android解決辦法:

在./android/app/src/main/AndroidManifest.xml配置文件中application標(biāo)簽里面設(shè)置networkSecurityConfig屬性:

<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
    <application android:networkSecurityConfig="@xml/network_security_config">
         <!-- ... -->
    </application>
</manifest>

在./android/app/src/main/res目錄下創(chuàng)建xml文件夾(已存在不用創(chuàng)建)只锻,在xml文件夾下創(chuàng)建network_security_config.xml文件,內(nèi)容如下:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <certificates src="system" />
        </trust-anchors>
    </base-config>
</network-security-config>

IOS無法訪問http

在./ios/Runner/Info.plist文件中添加如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    ...
    <key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
    </dict>
</dict>
</plist>

文章轉(zhuǎn)自老孟程序員

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末紫谷,一起剝皮案震驚了整個濱河市齐饮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌笤昨,老刑警劉巖祖驱,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異瞒窒,居然都是意外死亡捺僻,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門崇裁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來匕坯,“玉大人,你說我怎么就攤上這事拔稳「鹁” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵巴比,是天一觀的道長泞歉。 經(jīng)常有香客問我逼侦,道長匿辩,這世上最難降的妖魔是什么腰耙? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮铲球,結(jié)果婚禮上挺庞,老公的妹妹穿的比我還像新娘。我一直安慰自己稼病,他們只是感情好选侨,可當(dāng)我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著然走,像睡著了一般援制。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上芍瑞,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天晨仑,我揣著相機與錄音,去河邊找鬼拆檬。 笑死洪己,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的竟贯。 我是一名探鬼主播答捕,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼屑那!你這毒婦竟也來了拱镐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤持际,失蹤者是張志新(化名)和其女友劉穎沃琅,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體选酗,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡阵难,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了芒填。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片呜叫。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖殿衰,靈堂內(nèi)的尸體忽然破棺而出朱庆,到底是詐尸還是另有隱情,我是刑警寧澤闷祥,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布娱颊,位于F島的核電站傲诵,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏箱硕。R本人自食惡果不足惜拴竹,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望剧罩。 院中可真熱鬧栓拜,春花似錦、人聲如沸惠昔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽镇防。三九已至啦鸣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間来氧,已是汗流浹背诫给。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留饲漾,地道東北人蝙搔。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像考传,于是被迫代替她去往敵國和親吃型。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,490評論 2 348

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