Flutter 實用筆記

1、退出App

SystemNavigator.pop()

2切诀、攔截返回鍵

WillPopScope(
  child: Scaffold(),
   onWillPop: () {
      /// 如果回調(diào)返回一個解析為false的Future揩环,則攔截路由跳轉(zhuǎn)。
      /// return Future.value(false);
     return Future.value(true);
   },
);

3幅虑、點擊空白取消TextField焦點 隱藏鍵盤

GestureDetector(
  behavior: HitTestBehavior.translucent,
  onTap: () {
    // 點擊空白取消所有輸入框焦點丰滑,隱藏鍵盤
    FocusScope.of(context).requestFocus(FocusNode());
  },
  child:...,
)

behavior:表現(xiàn)方式。
默認[ HitTestBehavior.deferToChild]

enum HitTestBehavior {
  /// 遵從其子女的目標 將在其范圍內(nèi)接收事件翘单,只有當他們的一個孩子被擊中時吨枉。
  /// (child處理事件)
  deferToChild,

  /// 不透明的目標可以通過命中測試來命中,這使得它們既可以在其范圍內(nèi)接收事件哄芜,又可以防止其背后的目標也接收事件貌亭。
  /// (自己處理事件)
  opaque,

  /// 半透明目標既可以在其范圍內(nèi)接收事件,也可以允許其背后的可視目標接收事件认臊。
  /// (自己和chuild都可以處理事件)
  translucent,
}

4圃庭、手動移除/獲取指定輸入框焦點

FocusNode _focusNode = FocusNode();
...

TextField(
  focusNode: _focusNode,
  ...
)

// 移除焦點
_focusNode.unfocus();

// 獲得焦點
FocusScope.of(context).requestFocus(_focusNode);

// 是否獲得焦點的狀態(tài)
_focusNode.hasFocus

5、手動彈出/收起鍵盤

// 手動彈出鍵盤
SystemChannels.textInput.invokeMethod('TextInput.show');

// 手動收起鍵盤
SystemChannels.textInput.invokeMethod('TextInput.hide');

6失晴、自定義Widget實現(xiàn)PreferredSize

class CustomPreferredSize extends StatelessWidge implements PreferredSizeWidget {
  CustomPreferredSize({
    this.height = kToolbarHeight,
    this.child,
  });

  final double height;
  final Widget child;

  @override
  Widget build(BuildContext context) => child;

  @override
  Size get preferredSize => Size.fromHeight(height);
}

// 使用示例
//Scaffold(
//  appBar: CustomPreferredSize(child: _AppBar()),
//);

//class _AppBar extends StatelessWidget {
//  @override
//  Widget build(BuildContext context) {
//    return AppBar(title: Text('DEMO'));
//  }
//}

7剧腻、dart 千分位格式化金額(正則)

  /// 千分位格式化金額
  /// [toFixed] 保留多少位小數(shù)點 默認保留全部
  /// formatMoney(123456) => 123,456
  /// formatMoney(123456.1234) => 123,456.1234
  /// formatMoney(123456.1234, toFixed: 2) => 123,456.12
  static String formatMoney(Object val, {int toFixed}) {
    if (toFixed != null) {
      val = double.parse(val.toString()).toStringAsFixed(toFixed);
    }
    List<String> split = val.toString().split('.');
    String str = split[0].replaceAll(RegExp(r"\B(?=(\d{3})+(?!\d))"), ",");
    if (split.length > 1) return str + '.' + split[1];
    return str;
  }

8、監(jiān)測APP前后臺切換

class Demo extends StatefulWidget {
  @override
  _DemoState createState() => _DemoState ();
}

class _DemoState extends State<Demo> with SingleTickerProviderStateMixin, WidgetsBindingObserver {

  @override
  void initState() {
    WidgetsBinding.instance.addObserver(this);
    super.initState();
  }

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    if (state == AppLifecycleState.resumed) {
     print('切換至前臺');
    }
    super.didChangeAppLifecycleState(state);
  }

  @override
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Container();
  }
}

9涂屁、重啟APP

// 重啟APP組件
class ResetApp extends StatefulWidget {
  ResetApp({@required this.child});

  final Widget child;

  static void reset(BuildContext context) async {
    //查找頂層_ResetAppState并重啟
    context.findAncestorStateOfType<_ResetAppState>().reset();
  }

  @override
  _ResetAppState createState() => _ResetAppState();
}

class _ResetAppState extends State<ResetApp> {
  Key _key = UniqueKey();

  void reset() {
    //重新生成key導致控件重新build 達到重啟APP的效果
    setState(() => _key = UniqueKey());
  }

  @override
  Widget build(BuildContext context) {
    return KeyedSubtree(
      key: _key,
      child: widget.child,
    );
  }
}

保證ResetApp始終包裹住MaterialApp书在,如下

void main() {
  runApp(
    ResetApp(child: MaterialApp()),
  );
}

需要重啟時調(diào)用 ↓

ResetApp.reset(context);

未完待續(xù)...

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市拆又,隨后出現(xiàn)的幾起案子儒旬,更是在濱河造成了極大的恐慌,老刑警劉巖帖族,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件栈源,死亡現(xiàn)場離奇詭異,居然都是意外死亡竖般,警方通過查閱死者的電腦和手機甚垦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人艰亮,你說我怎么就攤上這事闭翩。” “怎么了迄埃?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵男杈,是天一觀的道長。 經(jīng)常有香客問我调俘,道長,這世上最難降的妖魔是什么旺垒? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任彩库,我火速辦了婚禮,結(jié)果婚禮上先蒋,老公的妹妹穿的比我還像新娘骇钦。我一直安慰自己,他們只是感情好竞漾,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布眯搭。 她就那樣靜靜地躺著,像睡著了一般业岁。 火紅的嫁衣襯著肌膚如雪鳞仙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天笔时,我揣著相機與錄音棍好,去河邊找鬼。 笑死允耿,一個胖子當著我的面吹牛借笙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播较锡,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼业稼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蚂蕴?” 一聲冷哼從身側(cè)響起低散,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎掂墓,沒想到半個月后谦纱,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡君编,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年跨嘉,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吃嘿。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡祠乃,死狀恐怖梦重,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情亮瓷,我是刑警寧澤琴拧,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站嘱支,受9級特大地震影響蚓胸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜除师,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一沛膳、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧汛聚,春花似錦锹安、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至痕貌,卻和暖如春风罩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背芯侥。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工泊交, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人柱查。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓廓俭,卻偏偏與公主長得像,于是被迫代替她去往敵國和親唉工。 傳聞我的和親對象是個殘疾皇子研乒,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345