2016-11-13 106 views
6

我想在Flutter的有狀態小部件中顯示簡單SnackBar。我的應用程序使用名爲MyHomePage的有狀態小部件創建MaterialApp的新實例。在Flutter中顯示SnackBar

我嘗試在showSnackBar()方法中顯示SnackBar。但它失敗,'方法'showSnackBar'被調用爲空'。

這段代碼有什麼問題?

class MyApp extends StatelessWidget { 
    @override 
    Widget build(BuildContext context) { 
    return new MaterialApp(
     title: 'Flutter', 
     theme: new ThemeData(
     primarySwatch: Colors.blue, 
    ), 
     home: new MyHomePage(), 
    ); 
    } 
} 

class MyHomePage extends StatefulWidget { 
    MyHomePage({Key key}) : super(key: key); 

    @override 
    _MyHomePageState createState() => new _MyHomePageState(); 
} 

class _MyHomePageState extends State<MyHomePage> { 

    final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>(); 

    @override 
    void initState() { 
    super.initState(); 
    showInSnackBar("Some text"); 
    } 

    @override 
    Widget build(BuildContext context) { 
    return new Padding(
      key: _scaffoldKey, 
      padding: const EdgeInsets.all(16.0), 
      child: new Text("Simple Text") 
    ); 
    } 

    void showInSnackBar(String value) { 
    _scaffoldKey.currentState.showSnackBar(new SnackBar(
     content: new Text(value) 
    )); 
    } 
} 

SOLUTION:

class MyApp extends StatelessWidget { 
    @override 
    Widget build(BuildContext context) { 
    return new MaterialApp(
     title: 'Flutter', 
     theme: new ThemeData(
      primarySwatch: Colors.blue, 
     ), 
     home: new Scaffold(body: new MyHomePage()), 
    ); 
    } 
} 

class MyHomePage extends StatefulWidget { 
    MyHomePage({Key key}) : super(key: key); 

    @override 
    _MyHomePageState createState() => new _MyHomePageState(); 
} 

class _MyHomePageState extends State<MyHomePage> { 

    @override 
    void initState() { 
    super.initState(); 
    } 

    @override 
    Widget build(BuildContext context) { 
    showInSnackBar("Some text"); 
    return new Padding(
     padding: const EdgeInsets.all(16.0), 
     child: new Scaffold(
      body: new Text("Simple Text") 
     ) 
    ); 
    } 

    void showInSnackBar(String value) { 
    Scaffold.of(context).showSnackBar(new SnackBar(
     content: new Text(value) 
    )); 
    } 
} 

回答

6

有三個問題:如果你改變你的代碼,你可以從build法顯示小吃吧。首先是你沒有任何地方的腳手架,腳手架小部件是知道如何顯示小吃店的。第二個是你有一把鑰匙來握住腳手架,但你已經把它放在墊子上(而Paddings沒有任何小吃店的知識)。第三個是你在與它相關聯的小部件之前使用過的密鑰有機會被初始化,因爲initState在構建之前被調用。

最簡單的辦法是在你的MyApp的小工具來改變home行:

home: new Scaffold(body: new MyHomePage()),

...然後去掉一個_scaffoldKey都不在話下,而使用Scaffold.of(context),你現在有_scaffoldKey.currentState

+0

用新的'Scaffold'封裝我的StatefulWidget並使用'Scaffold.of(context)'代替'_scaffoldKey'引用幫助。謝謝! –

1

initStatebuild之前,我想_scaffoldKey.currentState當它調用尚未初始化被調用。

我不知道你是否可以從initState得到ScaffoldState

Scaffold.of(context).showSnackBar(new SnackBar(new Text(value))); 
+0

簡單地將'showInSnackBar()'方法移動到build()不起作用。一方面你是對的 - 在build()方法之前調用initState(),但即使在initState()方法之後,Scaffold.of(context)和字段'_scaffoldKey.currentState'也是null。 –