Flutter 将Dart代码重构为单独的文件
我有这个代码,我有我的应用程序中的侧栏(抽屉)。我已经创建了一个单独的文件Flutter 将Dart代码重构为单独的文件,flutter,dart,refactoring,navigation-drawer,Flutter,Dart,Refactoring,Navigation Drawer,我有这个代码,我有我的应用程序中的侧栏(抽屉)。我已经创建了一个单独的文件drawer.dart,看起来有点像这样: import 'package:flutter/material.dart'; class DrawerClass extends StatefulWidget { @override _DrawerClassState createState() => _DrawerClassState(); } class _DrawerClassState extends
drawer.dart
,看起来有点像这样:
import 'package:flutter/material.dart';
class DrawerClass extends StatefulWidget {
@override
_DrawerClassState createState() => _DrawerClassState();
}
class _DrawerClassState extends State<DrawerClass> {
@override
Widget build(BuildContext context) {
return Drawer(
child: ListView(
padding: EdgeInsets.zero,
children: [
DrawerHeader(
child: CircleAvatar(
backgroundColor: Theme.of(context).primaryColor,
radius: 30,
child: Icon(
Icons.pets,
size: 60,
color: Colors.white,
),
),
),
ListTile(
leading: Icon(Icons.home),
title: Text("Home"),
onTap: () {
Navigator.pushReplacementNamed(context, "/home");
},
),
ListTile(
leading: Icon(
Icons.report,
),
title: Text("Report"),
onTap: () {
Navigator.pushReplacementNamed(context, "/report");
},
),
ListTile(
leading: Icon(
Icons.settings,
),
title: Text("Settings"),
onTap: () {
Navigator.pop(context);
},
),
],
),
);
}
}
导入“包装:颤振/材料.省道”;
类DrawerClass扩展了StatefulWidget{
@凌驾
_抽屉分类状态createState()=>\u抽屉分类状态();
}
类_DrawerClassState扩展了状态{
@凌驾
小部件构建(构建上下文){
回程抽屉(
子:ListView(
填充:EdgeInsets.zero,
儿童:[
抽屉阅读器(
孩子:圆环星(
背景色:主题。背景色,
半径:30,
子:图标(
图标,宠物,
尺码:60,
颜色:颜色,白色,
),
),
),
列表砖(
前导:图标(Icons.home),
标题:文本(“主页”),
onTap:(){
Navigator.pushReplacementNamed(上下文,“/home”);
},
),
列表砖(
领先:图标(
Icons.report,
),
标题:文本(“报告”),
onTap:(){
Navigator.pushReplacementNamed(上下文,“/report”);
},
),
列表砖(
领先:图标(
图标。设置,
),
标题:文本(“设置”),
onTap:(){
Navigator.pop(上下文);
},
),
],
),
);
}
}
现在我有三个不同的文件:home.dart
,report.dart
,settings.dart
。当在settings.dart
中使用此重构代码时,它将完美地工作,但在其他两个文件中则无法工作。例如,如果我在report.dart
中使用它,我必须将其onTap状态更改为Navigator.pop
。我需要在所有其他3个文件中使用drawer.dart
,仅更改每个文件中的onTap状态
任何帮助都将不胜感激:)一种方法就是这样做
enum ScreenName {
Home,
Report,
Settings,
}
将此enum
用作DrawerClass
的属性(parentScreen),以便它知道它在哪个屏幕中
class DrawerClass extends StatefulWidget {
final ScreenName parentScreen;
const DrawerClass({@required this.parentScreen});
@override
_DrawerClassState createState() => _DrawerClassState();
}
class _DrawerClassState extends State<DrawerClass> {
@override
Widget build(BuildContext context) {
return Drawer(
child: ListView(
padding: EdgeInsets.zero,
children: [
// other children,
ListTile(
leading: Icon(Icons.home),
title: Text("Home"),
onTap: () {
if (widget.parentScreen == ScreenName.Home)
Navigator.pop(context);
else
Navigator.pushReplacementNamed(context, "/home");
},
),
ListTile(
leading: Icon(Icons.report),
title: Text("Report"),
onTap: () {
if (widget.parentScreen == ScreenName.Report)
Navigator.pop(context);
else
Navigator.pushReplacementNamed(context, "/report");
},
),
ListTile(
leading: Icon(Icons.settings),
title: Text("Settings"),
onTap: () {
if (widget.parentScreen == ScreenName.Settings)
Navigator.pop(context);
else
Navigator.pushReplacementNamed(context, "/settings");
},
),
],
),
);
}
}
谢谢你的回答。我想对颜色和样式也做同样的事情,例如,如果父屏幕是主屏幕-我想将它的图标颜色更改为
color:Theme.of(context).colorScheme.onPrimary
,将它的文本样式和颜色更改为style:Theme.of(context).textTheme.bodyText1.copyWith(color:Theme.of(context).colorScheme.onPrimary,)
和tileColor totileColor:Theme.of(context).primaryColor
其他颜色相同screens@HaardikDharma,您可以使用相同的属性(parentScreen
)来决定要设置的颜色
或样式。您可以写下一个示例吗?我试着按照你说的去做,但没有看透示例,Icon(Icons.home,color:widget.parentScreen==ScreenName.home?color1:color2)
DrawerClass(parentScreen: ScreenName.Settings)