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 to
tileColor:Theme.of(context).primaryColor
其他颜色相同screens@HaardikDharma,您可以使用相同的属性(
parentScreen
)来决定要设置的
颜色
样式。您可以写下一个示例吗?我试着按照你说的去做,但没有看透示例,
Icon(Icons.home,color:widget.parentScreen==ScreenName.home?color1:color2)
DrawerClass(parentScreen: ScreenName.Settings)