首页 > 解决方案 > 如何去除材质 PageView 组件中的飞溅?

问题描述

如何消除材料 PageView 组件中的飞溅?我尝试将 ThemeData 的accentColor和设置splashColorColors.transparent,但这会导致整个应用程序出现透明的黑色飞溅。

我试图NoSplashContainer从这个解决方案中创造一个非常相似的东西,但飞溅仍然在孩子们的体内。

import 'package:flutter/material.dart';

class NoSplashContainer extends StatelessWidget {
  final Widget child;
  NoSplashContainer(this.child) : assert(child != null);
  @override
  Widget build(BuildContext context) {
    return (new Container(
        child: new Theme(
            data: Theme
                .of(context)
                .copyWith(splashFactory: const NoSplashFactory()),
            child: child)));
  }
}

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) {}
}

NoSplashContainer是这样用的。。

new NoSplashContainer(new PageView(
   children: ...,
)));

但飞溅仍然存在于PageView.

标签: flutter

解决方案


有一个Widget调用Theme会将主题应用于后代小部件。因此,您可以使用Theme自定义应用程序的任何部分,而无需修改整个应用程序的主题。像这样的东西:

new Theme(
      data: Theme.of(context).copyWith(
        splashColor: Colors.transparent
      ), 
      child:....
    );

推荐阅读