Выполнение этого без использования blo c усложнит управление вашим кодом по мере его масштабирования, если только вам не нужен прототип приложения без какой-либо бизнес-логики c.
Тем не менее, вы можете сделать это без blo c следующим образом:
- Поместите весь экран в
body:
в виде списка, который отображает соответствующий экран путем индексации. как
body: [
Expenses(),
Inspiration()
Personal(),
Work(),
More(),
].elementAt(selectedIndex),
drawer: MdDrawer(onTap: (int val){
setState(() {
this._selectedIndex=val;
});
}
,)
Теперь вы можете pu sh желаемое тело для отображения, предоставив индекс в качестве возвращаемого значения Navigator.of(context).pop(index)
или обратного вызова функция в MdDrawer
. Мы будем делать метод функции обратного вызова. Возврат индекса будет использоваться для обновления состояния с помощью setState.
class MdDrawer extends StatelessWidget {
final String title; final Function onTap;
MdDrawer({Key key, this.title, this.onTap}) : super(key: key);
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: AppBar(
title: Text(title),
),
body: Center(
child: Text('MyPage'),
),
drawer: Drawer(
child: ListView(
padding: EdgeInsets.zero,
children: <Widget>[
UserAccountsDrawerHeader(
accountName: const Text(_AccountName),
accountEmail: const Text(_AccountEmail),
currentAccountPicture: CircleAvatar(
backgroundColor: Colors.brown,
child: Text(_AccountAbbr),
),
),
ListTile(
leading: Icon(Icons.lightbulb_outline),
title: Text('Notes'),
onTap: () => _alertOnListTileTap(context, 0),
),
ListTile(
leading: Icon(Icons.lightbulb_outline),
title: Text('Expenses'),
onTap: () => _alertOnListTileTap(context, 1),
),
Divider(),
...
],
),
),
);
}
_alertOnListTileTap(BuildContext context, int index ) {
onTap(indext);
Navigator.of(context).pop();
}
}
Надеюсь, это поможет