我正在使用底部导航栏。在某个事件触发器上,我需要在当前屏幕上显示一些警告。
这就是我实现底部导航栏的方式。我有四个标签。
在这里,我需要在_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???");
}
});
}
}
答案 0 :(得分:1)
在任何有状态小部件的build方法中,您都可以获取构建上下文。如果您无法执行此操作,则Flutter团队的以下示例将使用GlobalKey<ScaffoldState>
来获取显示SnackBar警报的访问权限。
答案 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(....);
}
}