Flutter - 设置 sidenav 渐变颜色时不显示列表图块的悬停颜色(MacOS 应用程序)

Flutter - hover color of list tile not showing when sidenav gradient color is set (MacOS app)

我正在尝试添加带有渐变颜色的侧边导航栏,效果很好。但是,我还将列表图块(仪表板)的悬停颜色设置为红色,但是当我悬停时它没有显示。

我猜测当鼠标悬停时,sidenav 的背景色遮盖了列表图块的颜色。关于如何解决它的任何想法?谢谢!

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Flutter Demo',
      theme: ThemeData(
        pageTransitionsTheme: PageTransitionsTheme(builders: {
          TargetPlatform.iOS: FadeUpwardsPageTransitionsBuilder(),
          TargetPlatform.android: FadeUpwardsPageTransitionsBuilder(),
        }),
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key? key}) : super(key: key);

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final navigatorKey = GlobalKey<NavigatorState>();

  @override
  Widget build(BuildContext context) {
    return Row(
      children: <Widget>[
        Drawer(
          elevation: 0,
          child: Container(
            decoration: new BoxDecoration(
              border: Border(
                right: BorderSide(width: 0.0, color: Colors.transparent),
                left: BorderSide(width: 0.0, color: Colors.transparent),
              ),
              gradient: new LinearGradient(
                  colors: [
                    const Color(0xFFBE9CF9),
                    const Color(0xFF5378EE),
                  ],
                  begin: const FractionalOffset(0.0, 0.2),
                  end: const FractionalOffset(1.0, 1.0),
                  stops: [0.0, 1.0],
                  tileMode: TileMode.clamp),
            ),
            child: ListView(
              physics: NeverScrollableScrollPhysics(),
              children: <Widget>[
                Container(
                  width: double.infinity,
                  child: ListTile(
                    hoverColor: Colors.red,
                    enabled: true,
                    title: Padding(
                      padding: const EdgeInsets.all(0.0),
                      child: Row(
                        children: [
                          Icon(
                            Icons.home,
                            color: Colors.white,
                            size: 22.0,
                          ),
                          SizedBox(width: 8),
                          Text(
                            "Dashboard",
                            style: TextStyle(color: Colors.white),
                          ),
                        ],
                      ),
                    ),
                    onTap: () {},
                  ),
                ),
              ],
            ),
          ),
        ),
        Expanded(
          child: Navigator(
            key: navigatorKey,
            initialRoute: '/',
            onGenerateRoute: (settings) {
              return MaterialPageRoute(
                  builder: (context) {
                    return Scaffold(
                      appBar: AppBar(
                        backgroundColor: Colors.transparent,
                        foregroundColor: Colors.black,
                        elevation: 0,
                        iconTheme: IconThemeData(color: Colors.black),
                        title: Text("Title",
                            style: TextStyle(color: Colors.black)),
                      ),
                      body: SafeArea(
                        child: Padding(
                          padding: const EdgeInsets.all(16.0),
                          child: Text(""),
                        ),
                      ),
                    );
                  },
                  settings: settings);
            },
          ),
        ),
      ],
    );
  }
}

用 Material 小部件包装您的 ListTile:

Material(
    type: MaterialType.transparency,
    child: ListTile(...),
)

hoverColor 的工作方式 - 将悬停呈现在它找到的第一个 Material 父对象上。树中的第一个是 App 本身,渐变与它重叠。因此,您需要将 ListTile 包装在另一个 Material 小部件中,使其成为渐变之前的第一个小部件。
这是 Flutter 框架的已知行为(搜索类似的 Flutter Inkwell 装饰 问题)