如何在窗口小部件上禁用默认的splash / ripple / ink效果?有时效果是不需要的,例如在下面的TextField案例中:
答案 0 :(得分:7)
您可以将主题的splashFactory
替换为不绘制任何内容的主题:
class NoSplashFactory extends InteractiveInkFeatureFactory {
const NoSplashFactory();
@override
InteractiveInkFeature create({
@required MaterialInkController controller,
@required RenderBox referenceBox,
@required Offset position,
@required Color color,
bool containedInkWell: false,
RectCallback rectCallback,
BorderRadius borderRadius,
double radius,
VoidCallback onRemoved,
}) {
return new NoSplash(
controller: controller,
referenceBox: referenceBox,
);
}
}
class NoSplash extends InteractiveInkFeature {
NoSplash({
@required MaterialInkController controller,
@required RenderBox referenceBox,
}) : assert(controller != null),
assert(referenceBox != null),
super(
controller: controller,
referenceBox: referenceBox,
);
@override
void paintFeature(Canvas canvas, Matrix4 transform) {}
}
用它包装你的小部件:
child: new Theme(
data: new ThemeData(splashFactory: const NoSplashFactory()),
child: new TextField(...),
),
最初由HansMuller在GitHub PR上回答。
答案 1 :(得分:5)
根据上述@hunter的建议,我发现通过将主题中的highlightColor
和splashColor
都设置为Colors.transparent
可以消除波纹。
我确实担心设置highlightColor
可能会产生连锁反应,但是我还没有注意到。
答案 2 :(得分:3)
我将修改 Camilo 的方法,以确保我们不会覆盖父主题的其他属性。
var color = Colors.transparent;
Theme(
data: Theme.of(context).copyWith(
highlightColor: color,
splashColor: color,
hoverColor: color,
),
child: YourWidget(),
)
答案 3 :(得分:1)
我尝试了上述答案,但没有成功(splashColor: Colors.transparent, highlightColor: Colors.transparent,
)。
我的解决方案是仅设置hoverColor:Colors.transparent
答案 4 :(得分:1)
当我在寻找一种从列表过度滚动中删除斜线的方法时,没有一个与ThemeData相关的解决方案对我有用。我以为这个问题与我遇到的问题相同,因此对于面临相同误解的任何用户,以下解决方案都行之有效,并且将其放入无状态小部件时也很整洁,如下所示:
class NoSplash extends StatelessWidget {
NoSplash({this.child});
final Widget child;
@override
Widget build(BuildContext context) {
return NotificationListener<OverscrollIndicatorNotification>(
onNotification: (OverscrollIndicatorNotification overscroll) {
overscroll.disallowGlow();
return true;
},
child: child);
}
}
使用此方法的方法是简单地用NoSplash(child:)包装小部件
希望有人觉得这有用!
答案 5 :(得分:1)
final yourTheme = ThemeData.light();
...
Theme(
data: yourTheme.copyWith(
splashFactory: NoSplash.splashFactory,
),
...
)
ElevatedButton(
style: ElevatedButton.styleFrom(
splashFactory: NoSplash.splashFactory,
),
onPressed: () { },
child: Text('No Splash'),
)
答案 6 :(得分:0)
您可以将组件包装到Theme
中,并在splashColor
上将属性highlightColor
和ThemeData
设置为透明
Theme(
data: ThemeData(
splashColor: Colors.transparent,
highlightColor: Colors.transparent,
),
child: YourWidget(),
);