将 Dart 代码重构到一个单独的文件中

Refactoring Dart Code into a separate file

我有这段代码,我的应用程序中有侧边栏(抽屉)。我创建了一个单独的文件 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);
            },
          ),
        ],
      ),
    );
  }
}

现在我有三个不同的文件:home.dartreport.dartsettings.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");
            },
          ),
        ],
      ),
    );
  }
}

然后像这样使用DrawerClass。例如,对于设置屏幕 -

DrawerClass(parentScreen: ScreenName.Settings)