如何在Flutter中获取当前上下文?

时间:2018-05-09 05:21:26

标签: dart flutter

我正在使用底部导航栏。在某个事件触发器上,我需要在当前屏幕上显示一些警告。

这就是我实现底部导航栏的方式。我有四个标签。 在这里,我需要在_isHomeDetected为真时更改第4个标签的图标,当用户点击图标时,即在索引3上,我必须显示警告消息,而不管用户位于哪个标签中。我这样做吗?

class LandingScreen extends StatefulWidget {
  static Widget bottomNavigationBar;
  ..
}

class _LandingScreenState extends State<LandingScreen> {
  ...
  StreamSubscription<String> _subscription;
  bool _isHomeDetected = false;

  @override
  void initState() {
    ...
    _subscription = server.messages.listen(onData, onError: onError);
  }
  onData(message) {
    setState(() {
      _isHomeDetected = json.decode(message)["isHomeBeacon"];
    });
  }
  ...
  @override
  Widget build(BuildContext context) {
    LandingScreen.bottomNavigationBar = new BottomNavigationBar(
        ....
    );
    return new Scaffold(
      body: _currentPage,
      bottomNavigationBar: LandingScreen.bottomNavigationBar,
    );
  }

  _navigateToScreens(int currentIndex) {
    List screens = [
      ..
    ];
    setState((){

      if (!_isHomeDetected || currentIndex != 3){
        _currentPage = screens[currentIndex];
      } else {
        Utils.showCupertinoAlert(
            context: context, content: "You wanna log out???");
      }
    });
  }
}

2 个答案:

答案 0 :(得分:1)

在任何有状态小部件的build方法中,您都可以获取构建上下文。如果您无法执行此操作,则Flutter团队的以下示例将使用GlobalKey<ScaffoldState>来获取显示SnackBar警报的访问权限。

https://github.com/flutter/flutter/blob/master/examples/flutter_gallery/lib/demo/cupertino/cupertino_alert_demo.dart

答案 1 :(得分:0)

只是详细说明@Ron Geo给出的答案:

请注意,如果您的情况是: 您尝试从中调用 showSnackBar 的小部件不是 MaterialApp 的子项。

以下面的例子为例:

class App extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp();
  }
}

现在,如果您希望 App 小部件显示小吃栏,可以执行以下操作:

class App extends StatelessWidget {
  // 1
  GlobalKey<ScaffoldMessengerState> _scaffoldMessengerKey = GlobalKey();

  @override
  Widget build(BuildContext context) {
    return MaterialApp( 
      // 2
      scaffoldMessengerKey: _scaffoldMessengerKey,
    );
  }

  // 3
  void showSnackBar() {
     _scaffoldMessengerKey.currentState.showSnackBar(....);
  }
}

在您调用 showSnackBar 的小部件已经是 MaterialApp 的子级的大多数情况下,不需要重复此解决方案......在这种情况下,以下代码将简单地工作:

class MyPage extends StatelessWidget {
  void showSnackBar() {
     ScaffoldMessenger.of(context).showSnackBar(....);
  }
}