Saya memiliki kode ini di mana saya memiliki bilah sisi (laci) di aplikasi saya. Saya telah membuat file terpisah drawer.dart yang terlihat seperti ini :

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);
            },
          ),
        ],
      ),
    );
  }
}

Sekarang saya memiliki tiga file berbeda: home.dart , report.dart, settings.dart. Kode refactored ini akan bekerja dengan sempurna saat digunakan di settings.dart tetapi tidak di dua file lainnya. Contoh, jika saya menggunakan ini di report.dart, saya harus mengubah status onTap menjadi Navigator.pop. Saya perlu menggunakan drawer.dart di semua 3 file lainnya hanya mengubah status onTap di setiap file.

Bantuan apa pun akan dihargai :)

1
Haardik Dharma 2 April 2021, 23:56

1 menjawab

Jawaban Terbaik

Salah satu cara untuk melakukan ini adalah seperti itu.

enum ScreenName {
  Home,
  Report,
  Settings,
}

Gunakan enum ini sebagai properti (parentScreen) dari DrawerClass sehingga ia tahu di layar mana ia berada.

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");
            },
          ),
        ],
      ),
    );
  }
}

Kemudian gunakan DrawerClass seperti itu. Misalnya, untuk mengatur layar -

DrawerClass(parentScreen: ScreenName.Settings)
2
Jigar Patel 5 April 2021, 05:11