Flutter 如何正確顯示SnackBar
簡介
官方API文檔Scaffold的of方法說明有說明調(diào)用Scaffold.of方法是在Scallfold的子組件的Build方法中,也就是不能直接在構(gòu)建Scaffold的build方法里調(diào)用,否則會拋異常。
Typical usage of the Scaffold.of function is to call it from within the build method of a child of a Scaffold.
通常為顯示一個SnackBar需要構(gòu)建一個Builder,通過Builder的context調(diào)用(原因是)
Scallfold.of(context).showSnackBar(SnackBar(contenxt: Text('這是一個SnackBar'));
官方示例
顯示SnackBar,官方典型示例代碼如下所示:
import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { // This widget is the root of your application. @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Code Sample for Scaffold.of.', theme: ThemeData( primarySwatch: Colors.blue, ), home: Scaffold( body: MyScaffoldBody(), appBar: AppBar(title: Text('Scaffold.of Example')), ), color: Colors.white, ); } } // 在Scaffold子組件里的build方法可以調(diào)用Scaffold.of方法 class MyScaffoldBody extends StatelessWidget { @override Widget build(BuildContext context) { return Center( child: RaisedButton( child: Text('SHOW A SNACKBAR'), onPressed: () { Scaffold.of(context).showSnackBar( SnackBar( content: Text('Have a snack!'), ), ); }, ), ); } }
錯誤示例
但是若直接在構(gòu)建Scallfold的build方法中調(diào)用會報異常:
Scaffold.of() called with a context that does not contain a Scaffold.
錯誤代碼如下所示:
import 'package:flutter/material.dart'; class ScaffoldSnackBarDemo extends StatelessWidget { // This widget is the root of your application. @override Widget build(BuildContext context) { return Scaffold( body: Center( child: RaisedButton( child: Text('SHOW A SNACKBAR'), onPressed: () { ///直接在Scallfold的build方法里使用會拋異常 Scaffold.of(context).showSnackBar( SnackBar( content: Text('Have a snack!'), ), ); }, ), ), appBar: AppBar(title: Text('Scaffold.of Example')), ); } }
解決方法一:Scaffold的子組件通過Builder構(gòu)建
這時候要不就是按官方的,將需要顯示SnackBar的代碼另外抽離一個自定義子組件,在子組件的build方法再顯示SnackBar,要不就是在Scaffold的build方法體對該子組件再包一層Builder,如下所示。
import 'package:flutter/material.dart'; class ScaffoldSnackBarDemo extends StatelessWidget { // This widget is the root of your application. @override Widget build(BuildContext context) { return Scaffold( ///在子組件外再包一層builder,讓context不共用 body: Builder(builder: (context) { return Center( child: RaisedButton( child: Text('SHOW A SNACKBAR'), onPressed: () { Scaffold.of(context).showSnackBar( SnackBar( content: Text('Have a snack!'), ), ); }, ), ); }), appBar: AppBar(title: Text('Scaffold.of Example')), ); } }
解決方法二:使用GlobalKey存儲ScaffoldState
import 'package:flutter/material.dart'; class ScaffoldSnackBarDemo extends StatelessWidget { final _scallfoldKey = GlobalKey<ScaffoldState>(); @override Widget build(BuildContext context) { return Scaffold( ///使用GlobalKey解決 key: _scallfoldKey, body: Center( child: RaisedButton( child: Text('SHOW A SNACKBAR'), onPressed: () { _scallfoldKey.currentState.showSnackBar(SnackBar( content: Text('Have a snack!'), )); }, ), ), appBar: AppBar(title: Text('Scaffold.of Example')), ); } }
Flutter學習Github代碼倉庫
https://github.com/AiguangLi/Flutter
以上就是Flutter 如何正確顯示 SnackBar的詳細內(nèi)容,更多關(guān)于Flutter 正確顯示 SnackBar的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Android 推送原理(Android Push Notification)詳解
這篇文章主要介紹了Android 推送原理(Android Push Notification)詳解的相關(guān)資料,這里對Android 推送的原理做了簡單的介紹,需要的朋友可以參考下2016-11-11Android開發(fā)OkHttp執(zhí)行流程源碼分析
這篇文章主要為大家介紹了Android開發(fā)OkHttp執(zhí)行流程源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-09-09Android webview如何加載HTML,CSS等語言的示例
本篇文章主要介紹了Android webview如何加載HTML,CSS等語言的示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-11-11Android游戲開發(fā)學習①彈跳小球?qū)崿F(xiàn)方法
這篇文章主要介紹了Android游戲開發(fā)學習①彈跳小球?qū)崿F(xiàn)方法,涉及Android通過物理引擎BallThread類模擬小球運動的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-10-10