一尘不染

在不包含Scaffold的上下文中调用Scaffold.of()

flutter

如您所见,我的按钮在Scaffold的体内。但是我得到这个异常:

在不包含Scaffold的上下文中调用Scaffold.of()。

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

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

class HomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('SnackBar Playground'),
      ),
      body: Center(
        child: RaisedButton(
          color: Colors.pink,
          textColor: Colors.white,
          onPressed: _displaySnackBar(context),
          child: Text('Display SnackBar'),
        ),
      ),
    );
  }
}

_displaySnackBar(BuildContext context) {
  final snackBar = SnackBar(content: Text('Are you talkin\' to me?'));
  Scaffold.of(context).showSnackBar(snackBar);
}

编辑:

我找到了解决该问题的另一种方法。如果我们为Scaffold提供一个密钥,即GlobalKey,则可以如下所示显示SnackBar,而无需使用Builder小部件包装我们的主体。返回Scaffold的小部件应该是有状态的小部件:

 _scaffoldKey.currentState.showSnackBar(snackbar);

阅读 311

收藏
2020-08-13

共1个答案

一尘不染

发生此异常是因为您正在使用context实例化的小部件的Scaffold。不是的context孩子Scaffold

您可以通过使用不同的上下文来解决此问题:

Scaffold(
    appBar: AppBar(
        title: Text('SnackBar Playground'),
    ),
    body: Builder(
        builder: (context) => 
            Center(
            child: RaisedButton(
            color: Colors.pink,
            textColor: Colors.white,
            onPressed: () => _displaySnackBar(context),
            child: Text('Display SnackBar'),
            ),
        ),
    ),
);

请注意,尽管我们在Builder这里使用,但这并不是获取different的唯一方法BuildContext

也可以将子树提取到其他树中Widget(通常使用extract widget重构)

2020-08-13