我在试着设计这个景观.

enter image description here

我已经有了卡片的基本设计,但我想知道当用户点击其中之一时,如何更改卡片的背景 colored颜色 、卡片的边框 colored颜色 ,并根据当前卡片的宽度大小添加小绿色方块.重要的是要知道,当用户点击它时,只有一张卡片可以涂成绿色.

以下是我的代码:

CategoryCardModel

class CategoryCardModel {
  final String? categoryCardModelName;

  CategoryCardModel(this.categoryCardModelName);
}

CategoryCard

import 'dart:ffi';

import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';

class CategoryCard extends StatelessWidget {
  final String? categoryCardName;
  final Function()? wasPressed;

  const CategoryCard({
    super.key,
    required this.categoryCardName,
    this.wasPressed,
  });

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: wasPressed,
      child: Card(
        shape: RoundedRectangleBorder(
          side: const BorderSide(
            color: Color.fromRGBO(212, 213, 215, 100),
            width: 3,
          ),
          borderRadius: BorderRadius.circular(20.0),
        ),
        child: Container(
          decoration: BoxDecoration(
              color: const Color.fromRGBO(242, 243, 243, 100),
              borderRadius: BorderRadius.circular(20.0)),
          padding: const EdgeInsets.all(10),
          child: Text(
            categoryCardName ?? 'Todas',
            style: const TextStyle(
                fontSize: 25,
                fontWeight: FontWeight.bold,
                color: Color.fromRGBO(91, 94, 99, 100)),
          ),
        ),
      ),
    );
  }
}

MyHomePage

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';

import 'category_card.dart';
import 'category_card_model.dart';

class MyHomePage extends StatefulWidget {
  MyHomePage({super.key, required this.title});

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  // List of models
  final categoryCardModelList = <CategoryCardModel>[
    CategoryCardModel("Todas"),
    CategoryCardModel("Smartphones"),
    CategoryCardModel("Accesorios para celular"),
    CategoryCardModel("TV")
  ];

  List<CategoryCardModel>? _categoryCardModelListOf;

  @override
  void initState() {
    super.initState();
    setState(() {
      _categoryCardModelListOf = List.of(categoryCardModelList);
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text(widget.title),
        ),
        body: SingleChildScrollView(
            scrollDirection: Axis.horizontal,
            padding: const EdgeInsets.fromLTRB(10.0, 0.0, 10.0, 0.0),
            child: Row(
                mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                children: _categoryCardModelListOf!
                    .map<Widget>((categoryCardModel) => CategoryCard(
                        wasPressed: () {
                          print("Hello World");
                          setState(() {});
                        },
                        categoryCardName:
                            categoryCardModel.categoryCardModelName))
                    .toList())));
  }
}

main

import 'package:flutter/material.dart';

import 'my_home_page.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: "Caregory Cards"),
    );
  }
}

推荐答案

卡片需要 Select

class CategoryCard extends StatelessWidget {
  final String? categoryCardName;
  final Function()? wasPressed;
  final bool isActive;

  const CategoryCard(
      {super.key,
      required this.categoryCardName,
      this.wasPressed,
      this.isActive = false});

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: wasPressed,
      child: Card(
        shape: const StadiumBorder(),
        child: Container(
          decoration: BoxDecoration(
              color: (isActive ? Colors.green : Colors.grey).withOpacity(.1),
              borderRadius: BorderRadius.circular(24.0),
              border: Border.all(
                  width: 2, color: isActive ? Colors.green : Colors.grey)),
          padding: const EdgeInsets.all(10),
          child: Text(
            categoryCardName ?? 'Todas',
            style: const TextStyle(
                fontSize: 25,
                fontWeight: FontWeight.bold,
                color: Color.fromRGBO(91, 94, 99, 100)),
          ),
        ),
      ),
    );
  }
}

为所选模型创建状态变量

children: _categoryCardModelListOf!
    .map<Widget>((categoryCardModel) => CategoryCard(
        isActive: activeTab == categoryCardModel,
        wasPressed: () {
          activeTab = categoryCardModel;
          setState(() {});
        },
        categoryCardName: categoryCardModel.categoryCardModelName))
    .toList(),
),

Flutter相关问答推荐

在Flutter中为不受约束的小部件制作动画

Flutter在创建时为提供者调用初始化函数

如何从模型列表中生成DropdownButtonFormField?

Flutter—如何在Riverpod中使用全类状态?

try 在Flutter应用程序中传递变量到FirebaseFirestore Where子句

错误:找不到字体功能类型.Ffltter Google_Fonts包错误

在保持标高=1的情况下更改AppBar立面 colored颜色 /遮罩

我想在Flutter中画一个箭头,但我似乎无法填满空间

运行调试flutter应用程序时出错:B/BL超出范围(最大+/-128MB)到'';

打开键盘时屏幕组件会被压扁

如何在Flutter 中使用选定的键和值从 map 列表创建 map

如何使用 Material3 创建带有高度的完美白色提升按钮?

如何获取flutter中gridview项目占用的高度和宽度?

如何设置行中项目之间的空格相等?

Flutter - 展开图标无法正常工作

如何与 PostgreSQL 和外部网站交互 flutter apk?

java.lang.IncompatibleClassChangeError:找到接口 com.google.android.gms.location.SettingsClient,

在 flutter 中自定义 agora 视频通话 UI

我一直在try 创建按钮以导航到第二页,但不知何故 RaisedButton 功能无法正常工作

使用 mocktail 包进行单元测试时,类型Null不是Future类型的子类型