2016-11-13 13 views
6

मैं Flutter के स्टेटफुल विजेट के अंदर सरल स्नैकबार प्रदर्शित करना चाहता हूं। मेरा आवेदन सामग्री ऐप का नया उदाहरण बनाता है जिसमें MyHomePage नामक एक स्टेटस विजेट होता है।Flutter में स्नैकबार प्रदर्शित करें

मैं शो स्नैकबार() विधि में स्नैकबार दिखाने की कोशिश करता हूं। लेकिन यह के साथ विफल रहता है '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) 
    )); 
    } 
} 

समाधान:

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 विधि से Snackbar दिखा सकते हैं। पहला यह है कि आपके पास कहीं भी मचान नहीं है, और स्काफोल्ड विजेट वह है जो स्नैक बार दिखाने के बारे में जानता है। दूसरा यह है कि आपके पास मचान को पकड़ने की कुंजी है, लेकिन आपने इसे पैडिंग पर रखा है (और पैडिंग्स को स्नैक बार का कोई ज्ञान नहीं है)। तीसरा यह है कि आपने विजेट से पहले कुंजी का उपयोग किया है, जिसके साथ इसे शुरू करने का मौका मिला है, क्योंकि निर्माण से पहले initState को बुलाया जाता है।

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

... और फिर _scaffoldKey के सभी उल्लेख हटाने और बजाय Scaffold.of(context) का उपयोग जहां आप वर्तमान _scaffoldKey.currentState है:

सरल समाधान करने के लिए अपने MyApp विजेट में home लाइन बदलने के लिए है।

+0

मेरे स्टेटफुल विजिट को एक नए 'मचान' के साथ लपेटकर '_scaffoldKey' संदर्भ के बजाय' Scaffold.of (संदर्भ) 'का उपयोग करके मदद करता है। धन्यवाद! –

1

initStatebuild से पहले मुझे लगता है कि जब यह कॉल है _scaffoldKey.currentState प्रारंभ नहीं किया गया है बुलाया गया।

मुझे नहीं पता कि क्या आप initState से प्राप्त कर सकते हैं या नहीं। वहाँ तीन समस्याओं है

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

बस बनाने के लिए 'विधि showInSnackBar() 'को स्थानांतरित करने में मदद नहीं करता है। एक तरफ आप सही हैं - initState() को बिल्ड() विधि से पहले बुलाया जाता है, लेकिन initState() विधियों के बाद भी: 'Scaffold.of (संदर्भ)' के साथ-साथ फ़ील्ड '_scaffoldKey.currentState' शून्य है। –

संबंधित मुद्दे