gpt4 book ai didi

android - 如何在 Flutter 中将我的 AppBar 放在一个单独的文件中,同时仍然显示小部件?

转载 作者:IT王子 更新时间:2023-10-29 06:46:34 26 4
gpt4 key购买 nike

我目前正在构建一个 Flutter 应用程序,可以推荐该地区附近的餐馆。然而,我让自己陷入了困惑。

为了组织和清洁,我希望我的应用程序将 AppBar 的代码与每个屏幕的代码分开。因此,我构建了 KainAppBar.dart 作为 AppBar 代码。它显示在这里:

import 'package:flutter/material.dart';
import 'package:gradient_app_bar/gradient_app_bar.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:google_sign_in/google_sign_in.dart';

GoogleSignIn _googleSignIn = GoogleSignIn(
signInOption: SignInOption.standard,
);

class KainAppBar extends StatelessWidget {
final String title;

KainAppBar(this.title);

@override
Widget build(BuildContext context) {

return Scaffold(
appBar: new GradientAppBar(
centerTitle: true,
title: new Text('Kain',
style: TextStyle(
fontFamily: 'Quiapo', fontSize: 36.0, fontWeight: FontWeight.w600
)),
backgroundColorStart: Colors.red[400],
backgroundColorEnd: Colors.red[900],
),
drawer: new Drawer(
child: ListView(
children: <Widget>[
new UserAccountsDrawerHeader(
decoration: BoxDecoration(
color: Colors.red[800],
),
accountName: new Text('Guest'),
accountEmail: new Text('guestemail@email.com'),
currentAccountPicture: new CircleAvatar(
backgroundImage: new NetworkImage('https://avatarfiles.alphacoders.com/848/84855.jpg'),
),
),
new ListTile(
title: new Text('Restaurants'),
leading: Icon(Icons.restaurant_menu),
onTap: (){
Navigator.of(context).pop();
Navigator.of(context).pushNamed('/restaurant_screen');
},
),
new ListTile(
title: new Text('Nearby'),
leading: Icon(Icons.near_me),
onTap: (){
Navigator.of(context).pop();
Navigator.of(context).pushNamed('/nearby_screen');
},
),
new ListTile(
title: new Text('Request Restaurant'),
leading: Icon(Icons.library_add),
onTap: (){
Navigator.of(context).pop();
Navigator.of(context).pushNamed('/request_screen');
},
),
new ListTile(
title: new Text('Settings'),
leading: Icon(Icons.settings),
onTap: (){},
),
new ListTile(
title: new Text('About'),
leading: Icon(Icons.info_outline),
onTap: (){},
),
new ListTile(
title: new Text('Logout'),
leading: Icon(Icons.power_settings_new),
onTap: (){
_googleSignIn.disconnect();
FirebaseAuth.instance.signOut().then((value) {
Navigator.of(context).pushReplacementNamed('/login');
}).catchError((e) {
print(e);
});
},
),
],
),
),
body: new Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Container(
padding: EdgeInsets.fromLTRB(50.0, 160.0, 50.0, 0.0),
child: new Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
],
),
)
],
),

);

}
}

对于我的一些屏幕,我可以毫无问题地声明它。以下是 home_screen.dart 的代码:

    class HomeScreen extends StatefulWidget {
@override
HomeScreenState createState() {
return HomeScreenState();
}
}

class HomeScreenState extends State<HomeScreen>{
@override
noSuchMethod(Invocation invocation) {
return super.noSuchMethod(invocation);
}
@override
Widget build(BuildContext context){

return new KainAppBar("Kain");

}
}

但是,对于我的 restaurant_screen.dart,我遇到了一个问题。对于上下文,restaurant_screen.dart 所做的是通过带有三个选项(选项卡)的 TabBar 显示应用程序中包含的餐厅:餐厅列表、美食列表和历史记录。也就是说除了AppBar,它里面还需要有一个TabBar。但是我不能将这个 TabBar 放在 KainAppBar.dart 中,因为我只需要它显示在 restaurant_screen.dart 中。

这是我在 restaurant_screen.dart 中的 Widget 代码:

  @override
Widget build(BuildContext context) {
return new Column(
children: <Widget>[
GradientAppBar(
title: KainAppBar("Kain"),
bottom: new TabBar(
labelColor: Colors.white,
controller: tController,
tabs: <Widget>[
new Tab(text: 'List'),
new Tab(text: 'Cuisine'),
new Tab(text: 'Favorites'),
],
),
),
TabBarView(
controller: tController,
children: <Widget>[
new firstpage.RestaurantList(),
new secondpage.CuisineList(),
new thirdpage.RestaurantFavorites(),
],
),
],
);
}

运行代码只显示黑屏。有什么解决方法吗?

最佳答案

这是另一种处理方式。通过这样做,您可以根据需要自定义此应用程序栏。这样,如果您继续使用该样式,就不必在每个页面上都重新创建它。您只需创建一次并在任何小部件中调用它。

import 'package:flutter/material.dart';

class BaseAppBar extends StatelessWidget implements PreferredSizeWidget {
final Color backgroundColor = Colors.red;
final Text title;
final AppBar appBar;
final List<Widget> widgets;

/// you can add more fields that meet your needs

const BaseAppBar({Key key, this.title, this.appBar, this.widgets})
: super(key: key);

@override
Widget build(BuildContext context) {
return AppBar(
title: title,
backgroundColor: backgroundColor,
actions: widgets,
);
}

@override
Size get preferredSize => new Size.fromHeight(appBar.preferredSize.height);
}

实现在所需页面内

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: BaseAppBar(
title: Text('title'),
appBar: AppBar(),
widgets: <Widget>[Icon(Icons.more_vert)],
),
body: Container());
}

关于android - 如何在 Flutter 中将我的 AppBar 放在一个单独的文件中,同时仍然显示小部件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53411890/

26 4 0