问题描述
我有一条带有BottomNavigationBar
的路由,其中只有某些屏幕需要具有FloatingActionButton
。一个按钮可以是完整按钮,也可以是小型按钮,并附加有自定义操作(通常会打开一个弹出对话框)。
class TabScreen extends StatefulWidget {
TabScreen ({Key key}) : super(key: key);
@override
_TabScreenState createState() => _TabScreenState();
}
class _TabScreenState extends State<TabScreen> {
int _index = 0;
final _childScreens = <ChildScreen>[
ChildScreen1(),ChildScreen2(),ChildScreen3(),ChildScreen4()
];
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Tabs'),),bottomNavigationBar: BottomNavigationBarPart(
index: _index,onIndexChanged: (index) => setState(() {
this._index = index;
})),body: IndexedStack(
index: _index,children: _childScreens,floatingActionButton: Visibility(
child: FloatingActionButton(
child: Icon(_childScreens[_index].getFabIcon()),onpressed: () => _childScreens[_index].onFabpressed(),mini: _childScreens[_index].isFabMini()),visible: _childScreens[_index].hasFab()));
}
}
子屏幕的定义如下:
abstract class ChildScreen extends StatefulWidget {
@override
State<StatefulWidget> createState();
bool hasFab() {
return false;
}
IconData getFabIcon() {
return null;
}
bool isFabMini() {
return false;
}
void onFabpressed() {}
}
abstract class ChildScreenState<T extends StatefulWidget> extends State<T> {
@override
Widget build(BuildContext context);
}
现在问题出在该onFabpressed
方法上。它是在无状态小部件上的小部件上调用的,所以我不知道如何打开State
随播对象内部的对话框来访问上下文。
class ChildScreen1 extends ChildScreen {
@override
_ChildScreen1State createState() => _ChildScreen1State();
@override
bool hasFab() {
return true;
}
@override
IconData getFabIcon() {
return Icons.edit;
}
@override
bool isFabMini() {
return true;
}
@override
void onFabpressed() {
// How to call the showMyDialog() method?
}
}
class _ChildScreen1State extends ChildScreenState {
@override
Widget build(BuildContext context) {
// Omitted for brevity
}
Future showMyDialog() async {
return showDialog(
context: context,builder: (BuildContext context) {
return AlertDialog(
title: Text('Dialog'),content: Text('A dialog'),actions: <Widget>[
FlatButton(
child: Text(S.of(context).cancel.toupperCase()),onpressed: () {
Navigator.of(context).pop();
},FlatButton(
child: Text(S.of(context).ok.toupperCase()),],);
},);
}
}
我做错什么了吗?抱歉,但是我还是Flutter的新手,并试图掌握主要概念...
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)