Scaffold.of()被调用时传入了不包含Scaffold的上下文。

25 浏览
0 Comments

Scaffold.of()被调用时传入了不包含Scaffold的上下文。

正如您所看到的,我的按钮位于Scaffold的主体内。但我得到了这个异常:

Scaffold.of()使用了不包含Scaffold的上下文。

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一个key,这个key是GlobalKey,我们可以在不需要将我们的主体包装在Builder小部件内的情况下显示SnackBar。返回Scaffold的小部件应该是一个有状态的小部件。

 _scaffoldKey.currentState.showSnackBar(snackbar); 

admin 更改状态以发布 2023年5月22日
0
0 Comments

你可以使用 GlobalKey 来实现。唯一的缺点是,使用 GlobalKey 可能不是实现此目的最有效的方式。

一个好处是,你也可以将这个 key 传递给其他不包含任何 scaffold 的自定义 widget 类。查看 (这里)

class HomePage extends StatelessWidget {
  final _scaffoldKey = GlobalKey(); \\ new line
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      key: _scaffoldKey,                           \\ new line
      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?'));
    _scaffoldKey.currentState.showSnackBar(snackBar);   \\ edited line
  }
}

0
0 Comments

出现这个异常是因为你正在使用实例化Scaffold的小部件的context,而不是Scaffold的子元素的context

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

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,但这不是获取不同BuildContext的唯一方法。

还可以将子树提取到不同的Widget中(通常使用“提取小部件”重构)。

0