2016-11-13 4 views
6

Я хочу отобразить простой SnackBar внутри флаттера. Мое приложение создает новый экземпляр MaterialApp с виджетами с состоянием под названием MyHomePage.Дисплей SnackBar in Flutter

Я пытаюсь показать метод SnackBar в методе showSnackBar(). Но он не работает с 'Метод' 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

Там три проблемы. Во-первых, у вас нет леса в любом месте, а виджет Scaffold - тот, кто знает, как показывать закуски. Во-вторых, у вас есть ключ для захвата эшафота, но вместо этого вы положили его на Padding (а Paddings не знают о закусках). В-третьих, вы использовали ключ до того, как виджет, с которым он связан, имел возможность инициализироваться, поскольку initState вызывается перед сборкой.

Самое простое решение изменить home строку в MyApp виджета:

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

..., а затем удалить все упоминания о _scaffoldKey и вместо того, чтобы использовать Scaffold.of(context), где вы в настоящее время _scaffoldKey.currentState.

+0

обертывание моего StatefulWidget новым 'Scaffold' и использованием' Scaffold.of (context) 'вместо ссылки' _scaffoldKey'. Благодаря! –

1

initState был вызван до build Я думаю _scaffoldKey.currentState не был инициализирован, когда это вызов.

Я не знаю, можете ли вы получить ScaffoldState от initState. Если вы измените свой код, который можно показать закусочный от build метода с:

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

простое перемещение 'метода showInSnackBar()' to build() не помогает. С одной стороны, вы правы - initState() вызывается перед методом build(), но даже после методов initState(): 'Scaffold.of (context)', а также поле '_scaffoldKey.currentState' равны нулю. –

 Смежные вопросы

  • Нет связанных вопросов^_^