Home > Software design >  How can I fix the renderflex overflow of a card in Flutter?
How can I fix the renderflex overflow of a card in Flutter?

Time:10-22

How can I fix the RenderFlex overflowed pixel in my card Flutter? I cant seem to find a tutorial regarding this kind of problem. All of the tutorials in StackOverflow teach you to use the listview and SingleChildScrollView but that is not the case for me. The error shows in the card itself and I don't want the card to be using a singlechildscrollview.

I already tried fixing it by lowering the height and width but I will still need a proper tutorial that can help me fix this kind of issues.

This is the Problem in the Application itself.

This is the card.dart for the application

import 'package:flutter/material.dart';

class ListViewCard extends StatelessWidget {
  final String title;
  final void Function()? onTap;
  final String imageOfPlant; //Change to String

  const ListViewCard({
    super.key,
    required this.title,
    required this.onTap,
    required this.imageOfPlant,
  });

  @override
  Widget build(BuildContext context) {
    return Card(
      color: const Color.fromARGB(255, 75, 175, 78),
      elevation: 1,
      margin: const EdgeInsets.all(8),
      semanticContainer: true,
      clipBehavior: Clip.antiAliasWithSaveLayer,
      shape: RoundedRectangleBorder(
        borderRadius: BorderRadius.circular(10.0),
      ),
      child: InkWell(
        splashColor: Colors.lightGreenAccent.withAlpha(30),
        onTap: onTap,
        //sizedBox of the card
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            //image of the card
            Image.asset(
              imageOfPlant,
              height: 200,
              width: 150,
              fit: BoxFit.cover,
            ),
            SizedBox(
              height: 50,
              width: 150,
              child: Center(
                child: Text(
                  title,
                  textAlign: TextAlign.center,
                  style: const TextStyle(
                      fontSize: 19,
                      fontFamily: 'RobotoMedium',
                      color: Color(0xffeeeeee)), // textstyle
                ),
              ),
            ), //text //SizedBox
          ], // <widget>[]
        ), // column
      ), //inkwell
    ); // card
  }
}

This is the home.dart where the card will be called.

import 'package:flutter/material.dart';
import 'package:picleaf/nav_pages/plant.dart';
import '../widgets/card.dart';

class homePage extends StatefulWidget {
  const homePage({super.key});

  @override
  State<homePage> createState() => _HomePageState();
}

List<String> plants = [
  "Bell Pepper",
  "Cassava",
  "Grape",
  "Potato",
  "Strawberry",
  "Tomato",
];

class CustomSearchDelegate extends SearchDelegate {
  // Demo list to show querying

  CustomSearchDelegate({String hinttext = "Search plants here"})
      : super(searchFieldLabel: hinttext);

  // first overwrite to
  // clear the search text
  @override
  List<Widget>? buildActions(BuildContext context) {
    return [
      IconButton(
        onPressed: () {
          query = '';
        },
        icon: const Icon(Icons.clear),
      ),
    ];
  }

  // second overwrite to pop out of search menu
  @override
  Widget? buildLeading(BuildContext context) {
    return IconButton(
      onPressed: () {
        close(context, null);
      },
      icon: const Icon(Icons.arrow_back),
    );
  }

  // third overwrite to show query result
  @override
  Widget buildResults(BuildContext context) {
    List<String> matchQuery = [];
    for (var fruit in plants) {
      if (fruit.toLowerCase().contains(query.toLowerCase())) {
        matchQuery.add(fruit);
      }
    }
    return ListView.builder(
      itemCount: matchQuery.length,
      itemBuilder: (context, index) {
        var result = matchQuery[index];
        return ListTile(
          title: Text(
            result,
            style: const TextStyle(fontFamily: 'RobotoMedium'),
          ),
        );
      },
    );
  }

  // last overwrite to show the
  // querying process at the runtime
  @override
  Widget buildSuggestions(BuildContext context) {
    List<String> matchQuery = [];
    for (var fruit in plants) {
      if (fruit.toLowerCase().contains(query.toLowerCase())) {
        matchQuery.add(fruit);
      }
    }
    return ListView.builder(
      itemCount: matchQuery.length,
      itemBuilder: (context, index) {
        var result = matchQuery[index];
        return ListTile(
          title: Text(
            result,
            style: const TextStyle(fontFamily: 'RobotoMedium'),
          ),
        );
      },
    );
  }
}

class _HomePageState extends State<homePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        centerTitle: true,
        title: const Text(
          "PicLeaf",
          style: TextStyle(
              color: Color.fromRGBO(102, 204, 102, 1.0),
              fontWeight: FontWeight.bold),
        ),
        backgroundColor: Colors.white,
        shadowColor: const Color.fromARGB(255, 95, 94, 94),
        actions: [
          IconButton(
            onPressed: () {
              // method to show the search bar
              showSearch(
                  context: context,
                  // delegate to customize the search bar
                  delegate: CustomSearchDelegate());
            },
            icon: const Icon(Icons.search, color: Colors.black),
          )
        ],
      ),
      backgroundColor: const Color(0xffeeeeee),
      body: SingleChildScrollView(
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            const SizedBox(
              height: 10,
            ),
            Container(
              padding: const EdgeInsets.fromLTRB(20, 20, 20, 10),
              child: const Text(
                'Take a pic!',
                style: TextStyle(
                    fontSize: 35,
                    fontFamily: 'RobotoBold',
                    color: Colors.black),
                textAlign: TextAlign.left,
              ),
            ),
            Container(
              padding: const EdgeInsets.fromLTRB(20, 0, 20, 10),
              child: const Text('Find out what is wrong with your plant!',
                  style: TextStyle(
                      fontSize: 18,
                      fontFamily: 'RobotoMedium',
                      color: Color.fromRGBO(102, 124, 138, 1.0)),
                  textAlign: TextAlign.left),
            ),
            const SizedBox(
              height: 10,
            ),
            Container(
              color: const Color.fromRGBO(102, 204, 102, 1.0),
              child: Column(
                children: <Widget>[
                  Container(
                    padding: const EdgeInsets.fromLTRB(20, 10, 20, 0),
                    margin: const EdgeInsets.symmetric(horizontal: 0),
                    child: Row(
                      crossAxisAlignment: CrossAxisAlignment.start,
                      children: const <Widget>[
                        Expanded(
                          child: Text('List of Plants',
                              style: TextStyle(
                                  fontSize: 30,
                                  fontFamily: 'RobotoBold',
                                  color: Color(0xffeeeeee)),
                              textAlign: TextAlign.center),
                        ),
                      ],
                    ),
                  ),
                  GridView.count(
                    physics: const ScrollPhysics(),
                    shrinkWrap: true,
                    crossAxisSpacing: 20,
                    mainAxisSpacing: 20,
                    crossAxisCount: 2,
                    children: <Widget>[
                      ListViewCard(
                        title: "Bell Pepper",
                        onTap: () {
                          Navigator.of(context).push(MaterialPageRoute(
                              builder: (context) =>
                                  const SecondPage(plantname: 'Bell Pepper')));
                        },
                        imageOfPlant:
                            "assets/Images_of_Plant/BellPeper_Image.jpg",
                      ),
                      ListViewCard(
                        title: "Bell Pepper",
                        onTap: () {
                          Navigator.of(context).push(MaterialPageRoute(
                              builder: (context) =>
                                  const SecondPage(plantname: 'Bell Pepper')));
                        },
                        imageOfPlant:
                            "assets/Images_of_Plant/BellPeper_Image.jpg",
                      ),
                      ListViewCard(
                        title: "Bell Pepper",
                        onTap: () {
                          Navigator.of(context).push(MaterialPageRoute(
                              builder: (context) =>
                                  const SecondPage(plantname: 'Bell Pepper')));
                        },
                        imageOfPlant:
                            "assets/Images_of_Plant/BellPeper_Image.jpg",
                      ),
                      ListViewCard(
                        title: "Bell Pepper",
                        onTap: () {
                          Navigator.of(context).push(MaterialPageRoute(
                              builder: (context) =>
                                  const SecondPage(plantname: 'Bell Pepper')));
                        },
                        imageOfPlant:
                            "assets/Images_of_Plant/BellPeper_Image.jpg",
                      ),
                      ListViewCard(
                        title: "Bell Pepper",
                        onTap: () {
                          Navigator.of(context).push(MaterialPageRoute(
                              builder: (context) =>
                                  const SecondPage(plantname: 'Bell Pepper')));
                        },
                        imageOfPlant:
                            "assets/Images_of_Plant/BellPeper_Image.jpg",
                      ),
                      ListViewCard(
                        title: "Bell Pepper",
                        onTap: () {
                          Navigator.of(context).push(MaterialPageRoute(
                              builder: (context) =>
                                  const SecondPage(plantname: 'Bell Pepper')));
                        },
                        imageOfPlant:
                            "assets/Images_of_Plant/BellPeper_Image.jpg",
                      ),
                    ],
                  ),
                ],
              ),
            ),
          ],
        ),
      ),
    );
  }
}

CodePudding user response:

Your gridView's Item give you a specific size but you are setting more than that for your container and text, I suggest you try this:

child: Stack(
          children: <Widget>[
            //image of the card
            Image.asset(
              imageOfPlant,
              height: double.infinity,
              width: 150,
              fit: BoxFit.cover,
            ),
            Positioned(
              bottom: 0,
              left: 0,
              right: 0,
              child: SizedBox(
                height: 50,
                width: 150,
                child: Center(
                  child: Text(
                    title,
                    textAlign: TextAlign.center,
                    style: const TextStyle(
                        fontSize: 19,
                        fontFamily: 'RobotoMedium',
                        color: Color(0xffeeeeee)), // textstyle
                  ),
                ),
              ),
            ), //text //SizedBox
          ], // <widget>[]
        ),

and If you want to change item's AspectRatio you can do this:

GridView.count(
    physics: const ScrollPhysics(),
    shrinkWrap: true,
    crossAxisSpacing: 20,
    mainAxisSpacing: 20,
    crossAxisCount: 2,
    childAspectRatio: 2 / 3, <--- add this
    children: <Widget>[
     ...
    ]
 )
  • Related