如何實現(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) {
       
      },
    );
  }
}

底部導航切換導致重建問題

在使用底部導航時經(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(() {});
}

此用法導致每次切換時都會重建頁面给郊。

解決辦法迎罗,使用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切換導致重建(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開頭樱哼,_表示私有,只能在當前包內(nèi)使用剿配,別問我為什么如此命名搅幅,問就是源代碼中就是如此命名的。

如何移除debug模式下右上角“DEBUG”標識

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è)置當前控件大小為父控件大小的百分比

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();

如何判斷當前平臺

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)上默認禁止訪問http,主要是為了安全考慮性湿。

Android解決辦法:

在./android/app/src/main/AndroidManifest.xml配置文件中application標簽里面設(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閱讀 221,331評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異报咳,居然都是意外死亡侠讯,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,372評論 3 398
  • 文/潘曉璐 我一進店門暑刃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來厢漩,“玉大人,你說我怎么就攤上這事岩臣×锸龋” “怎么了?”我有些...
    開封第一講書人閱讀 167,755評論 0 360
  • 文/不壞的土叔 我叫張陵架谎,是天一觀的道長炸宵。 經(jīng)常有香客問我,道長谷扣,這世上最難降的妖魔是什么土全? 我笑而不...
    開封第一講書人閱讀 59,528評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮会涎,結(jié)果婚禮上涯曲,老公的妹妹穿的比我還像新娘。我一直安慰自己在塔,他們只是感情好幻件,可當我...
    茶點故事閱讀 68,526評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蛔溃,像睡著了一般绰沥。 火紅的嫁衣襯著肌膚如雪篱蝇。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,166評論 1 308
  • 那天徽曲,我揣著相機與錄音零截,去河邊找鬼。 笑死秃臣,一個胖子當著我的面吹牛涧衙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播奥此,決...
    沈念sama閱讀 40,768評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼弧哎,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了稚虎?” 一聲冷哼從身側(cè)響起撤嫩,我...
    開封第一講書人閱讀 39,664評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蠢终,沒想到半個月后序攘,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,205評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡寻拂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,290評論 3 340
  • 正文 我和宋清朗相戀三年程奠,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片祭钉。...
    茶點故事閱讀 40,435評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡瞄沙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出朴皆,到底是詐尸還是另有隱情,我是刑警寧澤泛粹,帶...
    沈念sama閱讀 36,126評論 5 349
  • 正文 年R本政府宣布遂铡,位于F島的核電站,受9級特大地震影響晶姊,放射性物質(zhì)發(fā)生泄漏扒接。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,804評論 3 333
  • 文/蒙蒙 一们衙、第九天 我趴在偏房一處隱蔽的房頂上張望钾怔。 院中可真熱鬧,春花似錦蒙挑、人聲如沸宗侦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,276評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽矾利。三九已至姑裂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間男旗,已是汗流浹背舶斧。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留察皇,地道東北人茴厉。 一個月前我還...
    沈念sama閱讀 48,818評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像什荣,于是被迫代替她去往敵國和親矾缓。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,442評論 2 359

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