【发布时间】:2019-10-20 12:38:51
【问题描述】:
我是 Flutter 的新手,在构建页面布局时正在寻找一些“最佳实践”建议。我来自 Java 背景,我总是尽可能地重复使用,但我不确定这是否真的是最好的方法。我有几个页面都有一个 Appbar 但有自己的操作。这些页面中的每一个都将共享一个公共抽屉。最初,我开始沿着创建公共根页面 Widget 的路径前进,当在抽屉中选择一个项目时,公共页面的正文会发生变化,如下所示:
class HomePage extends StatefulWidget {
final BaseAuth auth;
final Function onSignedOut;
const HomePage({Key key, this.auth, this.onSignedOut}) : super(key: key);
@override
State<StatefulWidget> createState() => new _HomePageState();
}
class _HomePageState extends State<HomePage> {
final drawerItems = [
new DrawerItem("Home", Icons.home),
new DrawerItem("Pantry", Icons.store),
new DrawerItem("Barcode Scanner", Icons.scanner)
];
int _selectedDrawerIndex = 0;
bool _isEmailVerified;
_getDrawerItemWidget(int pos) {
switch (pos) {
case 0:
return new HomePageFragment();
case 1:
return new UserPantryFragment();
case 2:
return new BarcodeScannerFragment();
default:
return new Text("Error");
}
}
_onSelectItem(int index) {
setState(() => _selectedDrawerIndex = index);
Navigator.of(context).pop(); // close the drawer
}
@override
Widget build(BuildContext context) {
var drawerOptions = <Widget>[];
for (var i = 0; i < drawerItems.length; i++) {
var d = drawerItems[i];
drawerOptions.add(new ListTile(
leading: new Icon(d.icon),
title: new Text(d.title),
selected: i == _selectedDrawerIndex,
onTap: () => _onSelectItem(i),
));
}
AuthenticationContext authenticationContext =
AuthenticationContext.of(context);
return new FutureBuilder<FirebaseUser>(
future: authenticationContext.auth.getCurrentUser(),
initialData: null,
builder: (BuildContext context, AsyncSnapshot<FirebaseUser> data) {
var name = data.data != null ? data.data.displayName : "";
var email = data.data != null ? data.data.email : " ";
var photoUrl = data.data != null && data.data.photoUrl != null
? data.data.photoUrl
: null;
return new Scaffold(
appBar: new AppBar(
title: new Text(drawerItems[_selectedDrawerIndex].title),
actions: <Widget>[
IconButton(
icon: Icon(Icons.search),
onPressed: () {
},
),
// overflow menu
PopupMenuButton<String>(
// onSelected: _signOut,
itemBuilder: (BuildContext context) {
return ['Logout'].map((String choice) {
return PopupMenuItem<String>(
value: choice,
child: Text(choice),
);
}).toList();
},
)
]),
drawer: new Drawer(
child: new Column(
children: <Widget>[
UserAccountsDrawerHeader(
accountName: Text(name != null ? name : ""),
accountEmail: Text(email),
currentAccountPicture: CircleAvatar(
// backgroundImage: FadeInImage.memoryNetwork(
// placeholder: kTransparentImage,
// image: photoUrl != null ? photoUrl : "",
// ).image,
child: new Text(
photoUrl == null ? email[0].toUpperCase() : ""),
),
),
new Column(children: drawerOptions)
],
),
),
body: _getDrawerItemWidget(_selectedDrawerIndex));
});
}
但是,我现在想知道在每个屏幕中从头开始创建脚手架而不尝试使用共享根页面是否会更好,因为我遇到了为每个页面轻松自定义 AppBar 的问题。我最初以为我可以在每个页面小部件上创建一些“buildAppBar”功能并让根页面使用它,但这似乎不是一个容易实现的解决方案......至少不是以一种优雅的方式,我可以找到。
【问题讨论】: