2016-11-13 51 views
6

basit SnackBar'ı Flutter'un durumlu widget'ında görüntülemek istiyorum. Benim uygulama MaterialAppMyHomePage adlı yeni bir widget ile yeni bir örnek oluşturur.Display SnackBar in Flutter

SnackBar'ı showSnackBar() yönteminde göstermeye çalışıyorum. Ama 'ile başarısız' showSnackBar 'yöntemi null' çağrıldı.

Bu kodun nesi yanlış?

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

ÇÖZÜM: Ben çağrı olduğunda _scaffoldKey.currentState başlatılmamış tahmin build önce

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

cevap

6

: Kodu değiştirirseniz ile build yönteminden snackbar gösterebilir. Birincisi, herhangi bir yerde bir İskele yok ve Scaffold parçacığı, atıştırmalık çubuklarını nasıl göstereceğini bilen kişidir. İkincisi, iskele tutulması için bir anahtarınız var, ama bunun yerine bir Padding'e koydunuz (ve Paddle'ların snack bar hakkında bilgisi yok). Üçüncüsü ise, initState'in inşa edilmeden önce çağrılmasından bu yana, ilişkili olduğu pencere öğesi için başlangıçta bir şansın olmasından önce anahtarı kullanmış olmanızdır.

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

... ve sonra _scaffoldKey tüm ifadeleri kaldırın ve şu anda _scaffoldKey.currentState sahip olduğu yerine Scaffold.of(context) kullanın:

basit çözüm için Uygulamam widget'ınızda home hattını değiştirmektir.

+0

, StatefulWidget'ımı yeni bir 'İskele' ile sarar ve '_scaffoldKey 'yerine' Scaffold.of (context)' kullanıldığında referans olur. Teşekkürler! –

1

initState çağrıldı.

initState'dan ScaffoldState alabileceğinizi bilmiyorum. Üç sorunlar var

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

basitçe “showInSnackBar()” yöntemini kurmak için build() işlevi yardımcı DEĞİLDİR. Bir tarafta doğru - initState() build() yönteminden önce çağrılır, ancak initState() yöntemlerinden sonra bile: "Scaffold.of (context)" alanının yanı sıra "_scaffoldKey.currentState" alanı boştur. –