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

Blu*_*shy 7 linear-gradients dart flutter

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

我猜测悬停时侧导航的背景颜色覆盖了列表图块的颜色。关于如何修复它有什么想法吗?谢谢!

在此输入图像描述

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);
            },
          ),
        ),
      ],
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

The*_*nut 19

用 Material 小部件包裹您的 ListTile:

Material(
    type: MaterialType.transparency,
    child: ListTile(...),
)
Run Code Online (Sandbox Code Playgroud)

悬停颜色的工作方式是在它找到的第一个材质父级上渲染悬停。树中的第一个是应用程序本身,渐变与它重叠。因此,您需要将 ListTile 包装在另一个 Material 小部件中,以便它是渐变之前的第一个小部件。
这是 Flutter 框架的已知行为(搜索类似的Flutter Inkwell 装饰问题)

  • 将整个 ListView 包装在 Material 小部件中也可以解决这个问题,并且比包装每个 ListTile 的开销更少。就我而言,hoverColor 与透明 AppBar 重叠,并将 ListView 包装在 Material 中解决了这个问题。 (2认同)

Bro*_*Das 9

可能导致这种情况的另一个问题(谈论将鼠标悬停在 上ListTile根本没有反应的一般情况)是因为没有onTap:传递属性。