📜  使用不包含脚手架的上下文调用颤振 Scaffold.of() (1)

📅  最后修改于: 2023-12-03 15:36:37.730000             🧑  作者: Mango

使用不包含脚手架的上下文调用颤振 Scaffold.of()

在 Flutter 开发中,我们可能需要在 widget 树的某处调用 Scaffold.of() 获取当前 Scaffold 实例的上下文,以便对 Scaffold 进行一些操作,比如弹出 SnackBar 或者 BottomSheet

如果我们在使用 Scaffold 的时候直接在 build 方法里面创建,那么 Scaffold 会自动关联到当前的 BuildContext 上下文中,我们可以直接调用 Scaffold.of(context) 来获取当前 Scaffold 实例的上下文。例如:

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('My Home Page'),
      ),
      body: Builder(
        builder: (context) => Center(
          child: ElevatedButton(
            child: Text('Show SnackBar'),
            onPressed: () {
              final snackBar = SnackBar(
                content: Text('SnackBar'),
                duration: Duration(seconds: 1),
              );
              ScaffoldMessenger.of(context).showSnackBar(snackBar);
            },
          ),
        ),
      ),
    );
  }
}

但是,有时我们需要在 build 方法之外的其他地方调用 Scaffold.of() 来获取当前 Scaffold 实例的上下文,这时就需要添加一个 Builder 来手动创建 BuildContext 上下文。例如:

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      key: _scaffoldKey,
      appBar: AppBar(
        title: Text('My Home Page'),
      ),
      body: Center(
        child: ElevatedButton(
          child: Text('Show SnackBar'),
          onPressed: () {
            _showSnackBar();
          },
        ),
      ),
    );
  }

  void _showSnackBar() {
    final snackBar = SnackBar(
      content: Text('SnackBar'),
      duration: Duration(seconds: 1),
    );
    _scaffoldKey.currentState.showSnackBar(snackBar);
  }
}

在这个例子中,我们使用了 GlobalKey 来获取 ScaffoldState 实例,并在 _showSnackBar() 方法中调用 showSnackBar() 方法来弹出 SnackBar,这种方式同样可以在其他场景下使用。

总之,无论是直接在 build 方法中创建 Scaffold,还是手动创建 BuildContext 上下文来调用 Scaffold.of(),我们都可以方便地对 Scaffold 进行操作,实现很多有趣的交互效果。