我所拥有的:

have

我想要的是:

want

我使用的是flutter_rating_bar个包,我想让它显示未选中的容器,而不是默认的灰色,并且只想更改选中容器的 colored颜色 .

如上图所示,我想要在所选容器之前显示剩余的未选中容器,而不是灰色框,如第二张图片所示.

代码:

RatingBar.builder(
  initialRating: initialRatings,
  itemCount: 5,
  itemSize: 50,
  itemPadding: EdgeInsets.symmetric(horizontal: containerWidth * 0.0077),
  itemBuilder: (context, index) {
    switch (index) {
      case 0:
        return Container(
          width: ratingContainerWidth,
          height: ratingContainerHeight,
          decoration: BoxDecoration(
            borderRadius: const BorderRadius.only(
              topLeft: Radius.circular(8),
              topRight: Radius.circular(8),
              bottomLeft: Radius.circular(8),
              bottomRight: Radius.circular(8),
            ),
            color: knowledgeRating == 1
                ? const Color.fromRGBO(109, 44, 237, 1)
                : const Color.fromRGBO(226, 243, 255, 1),
          ),
          padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 12),
          child: Text(
            '1',
            textAlign: TextAlign.left,
            style: TextStyle(
              color: knowledgeRating == 1
                  ? const Color.fromRGBO(255, 255, 255, 1)
                  : const Color.fromRGBO(0, 0, 0, 1),
              fontFamily: 'Inter',
              fontSize: 16,
              letterSpacing: 0.20000000298023224,
              fontWeight: FontWeight.bold,
            ),
          ),
        );
      case 1:
        return Container(
          width: ratingContainerWidth,
          height: ratingContainerHeight,
          decoration: BoxDecoration(
            borderRadius: const BorderRadius.only(
              topLeft: Radius.circular(8),
              topRight: Radius.circular(8),
              bottomLeft: Radius.circular(8),
              bottomRight: Radius.circular(8),
            ),
            color: knowledgeRating == 2
                ? const Color.fromRGBO(109, 44, 237, 1)
                : const Color.fromRGBO(226, 243, 255, 1),
          ),
          padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 12),
          child: Text(
            '2',
            textAlign: TextAlign.left,
            style: TextStyle(
              color: knowledgeRating == 2
                  ? const Color.fromRGBO(255, 255, 255, 1)
                  : const Color.fromRGBO(0, 0, 0, 1),
              fontFamily: 'Inter',
              fontSize: 16,
              letterSpacing: 0.20000000298023224,
              fontWeight: FontWeight.bold,
            ),
          ),
        );
      case 2:
        return Container(
          width: ratingContainerWidth,
          height: ratingContainerHeight,
          decoration: BoxDecoration(
            borderRadius: const BorderRadius.only(
              topLeft: Radius.circular(8),
              topRight: Radius.circular(8),
              bottomLeft: Radius.circular(8),
              bottomRight: Radius.circular(8),
            ),
            color: knowledgeRating == 3
                ? const Color.fromRGBO(109, 44, 237, 1)
                : const Color.fromRGBO(226, 243, 255, 1),
          ),
          padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 12),
          child: Text(
            '3',
            textAlign: TextAlign.left,
            style: TextStyle(
              color: knowledgeRating == 3
                  ? const Color.fromRGBO(255, 255, 255, 1)
                  : const Color.fromRGBO(0, 0, 0, 1),
              fontFamily: 'Inter',
              fontSize: 16,
              letterSpacing: 0.20000000298023224,
              fontWeight: FontWeight.bold,
            ),
          ),
        );
      case 3:
        return Container(
          width: ratingContainerWidth,
          height: ratingContainerHeight,
          decoration: BoxDecoration(
            borderRadius: const BorderRadius.only(
              topLeft: Radius.circular(8),
              topRight: Radius.circular(8),
              bottomLeft: Radius.circular(8),
              bottomRight: Radius.circular(8),
            ),
            color: knowledgeRating == 4
                ? const Color.fromRGBO(109, 44, 237, 1)
                : const Color.fromRGBO(226, 243, 255, 1),
          ),
          padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 12),
          child: Text(
            '4',
            textAlign: TextAlign.left,
            style: TextStyle(
              color: knowledgeRating == 4
                  ? const Color.fromRGBO(255, 255, 255, 1)
                  : const Color.fromRGBO(0, 0, 0, 1),
              fontFamily: 'Inter',
              fontSize: 16,
              letterSpacing: 0.20000000298023224,
              fontWeight: FontWeight.bold,
            ),
          ),
        );
      case 4:
        return Container(
          width: ratingContainerWidth,
          height: ratingContainerHeight,
          decoration: BoxDecoration(
            borderRadius: const BorderRadius.only(
              topLeft: Radius.circular(8),
              topRight: Radius.circular(8),
              bottomLeft: Radius.circular(8),
              bottomRight: Radius.circular(8),
            ),
            color: knowledgeRating == 5
                ? const Color.fromRGBO(109, 44, 237, 1)
                : const Color.fromRGBO(226, 243, 255, 1),
          ),
          padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 12),
          child: Text(
            '5',
            textAlign: TextAlign.left,
            style: TextStyle(
              color: knowledgeRating == 5
                  ? const Color.fromRGBO(255, 255, 255, 1)
                  : const Color.fromRGBO(0, 0, 0, 1),
              fontFamily: 'Inter',
              fontSize: 16,
              letterSpacing: 0.20000000298023224,
              fontWeight: FontWeight.bold,
            ),
          ),
        );
      default:
        return Container();
    }
  },
  onRatingUpdate: (rating) => setState(() {
    knowledgeRating = rating;
  }),
),

推荐答案

不幸的是,这不可能用flutter_rating_bar来实现.如果正在使用将unratedColor与子控件混合的itemBuilder,则判断源代码there is a color filter applied to the child.此unratedColor是源,由于过滤器被设置为BlendMode.srcIn,因此它总是获胜.

仅当itemBuilder为空时,才不应用此过滤器.但使其为空的唯一方法是设置为use the default constructor,并将ratingWidget设置为对所有评级重复相同的值.

幸运的是,源代码是可用的,只需将其派生为removing the filter并将派生指向pubspec.yaml,即可获得所需的结果,如下所示:

enter image description here

pubspec.yaml

# ...
dependencies:
  flutter_rating_bar:
    git:
      url: git://github.com/your_git_repo/flutter_rating_bar.git
      ref: master

更改后的小工具不带滤色器.

class _NoRatingWidget extends StatelessWidget {
  _NoRatingWidget({
    required this.size,
    required this.child,
    required this.enableMask,
    required this.unratedColor,
  });

  final double size;
  final Widget child;
  final bool enableMask;
  final Color unratedColor;

  @override
  Widget build(BuildContext context) {
    return SizedBox(
      height: size,
      width: size,
      child: FittedBox(
        fit: BoxFit.contain,
        child: child,
      ),
    );
  }
}

Flutter相关问答推荐

如何在容器中移动图标按钮?

如何防止onTapCancel由子元素触发?

Flutter OpenID Connect无效参数:redirect_uri using Keycloak

在背景图像上排列定位徽标

按一下按钮即可更新 fl_chart

如何在flutter中将所有单词的第一个字母大写

来自服务器的数据未分配给变量

无法将Null类型的值分配给 const 构造函数中List类型的参数

Firebase Auth - 有没有办法为新用户预先生成 UID?

你如何在 Flutter 中组合两个数组?

Riverpod 在使用冻结副本更新状态时触发重建,即使没有任何更改

Flutter - 定义按钮的优雅方式

无法在Flutter 图像小部件中打开大尺寸(500MB)图像

仅使用 Flutter 在本地环境中托管 Web 服务器

我几乎每次都将 Stateless Widget 与 BLoC 一起使用.我错了吗?

Flutter Web App 未启动:脚本的 MIME 类型不受支持

使用 Chaquopy 插件后 Gradle Sync 无法正常工作

一个或多个插件需要更高的 Android SDK 版本

带有 Dismissible 和 Provider (NotifyListener) 的笨拙动画

如何从 Firebase Firestore 中获取具有特定字段值的文档?