Home > front end >  How to change icon based on a String value in Flutter
How to change icon based on a String value in Flutter

Time:10-28

I have an app where im trying to set different icons for different values of text.

import 'package:flutter/material.dart';
import 'package:flutter/src/foundation/key.dart';
import 'package:flutter/src/widgets/framework.dart';
import 'package:get/get.dart';
import 'package:google_fonts/google_fonts.dart';

import '../utils/colors.dart';

class WidgetCard extends StatefulWidget {
  const WidgetCard({Key? key, required this.week, required this.status})
      : super(key: key);
  final String week;
  final String status;

  @override
  State<WidgetCard> createState() => _WidgetCardState();
}

class _WidgetCardState extends State<WidgetCard> {

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
  }
  @override
  Widget build(BuildContext context) {
    return InkWell(
      onTap: () {
        Get.toNamed('/weekform', arguments: widget.week);
      },
      child: Container(
        width: MediaQuery.of(context).size.width,
        padding: EdgeInsets.symmetric(horizontal: 10.0, vertical: 5.0),
        child: Card(
          color: AppColors.yellow_accent,
          elevation: 5.0,
          shape:
              RoundedRectangleBorder(borderRadius: BorderRadius.circular(20.0)),
          child: Container(
            width: MediaQuery.of(context).size.width,
            height: MediaQuery.of(context).size.height * (1 / 6),
            padding: EdgeInsets.symmetric(horizontal: 10.0, vertical: 10.0),
            decoration: BoxDecoration(
                color: AppColors.yellow_accent,
                borderRadius: BorderRadius.circular(20)),
            child: Row(
              mainAxisAlignment: MainAxisAlignment.spaceBetween,
              crossAxisAlignment: CrossAxisAlignment.start,
              children: [
                Align(
                  alignment: AlignmentDirectional.centerStart,
                  child: Row(
                    crossAxisAlignment: CrossAxisAlignment.start,
                    children: [
                       Align(
                        alignment: AlignmentDirectional.center,
                        child: Container(
                            height: 55.0,
                            child: Image.asset("assets/icons/checked.png")),
                      ),
                      SizedBox(
                        width: 17,
                      ),
                      Column(
                        crossAxisAlignment: CrossAxisAlignment.start,
                        mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                        children: <Widget>[
                          Container(
                            width: 100,
                            child: Text(
                              widget.week,
                              style: GoogleFonts.poppins(
                                  color: Colors.black,
                                  fontSize: 18.0,
                                  fontWeight: FontWeight.bold),
                              maxLines: 4,
                              overflow: TextOverflow.ellipsis,
                            ),
                          ),
                          Row(
                            children: [
                              Align(
                                alignment: AlignmentDirectional.bottomEnd,
                                child: Text("Status :  ",
                                    style: GoogleFonts.poppins(
                                        color: Colors.black,
                                        fontSize: 15.0,
                                        fontWeight: FontWeight.normal)),
                              ),
                              Align(
                                alignment: AlignmentDirectional.bottomEnd,
                                child: Text(widget.status,
                                    style: GoogleFonts.poppins(
                                        color: Colors.green,
                                        fontSize: 15.0,
                                        fontWeight: FontWeight.normal)),
                              ),
                            ],
                          ),
                        ],
                      ),
                      SizedBox(
                        width: 10,
                      ),
                    ],
                  ),
                )
              ],
            ),
          ),
        ),
      ),
    );
  }
}

The value is stored in the string status. How can i use it in a conditional to change the icon. There are three values for status. It can either be "Approved" , "Pending" or "Rejected"

I tried giving a conditional if(status) == "Approved" ? but it gives the error

The element type 'bool' can't be assigned to the list type 'Widget'.

CodePudding user response:

How about choosing asset directory first? After declairing your final String status, add

String assetKind;
  
  if (status=="Approved") {
    assetKind = "assets/icons/checked.png";
  } else if (status == "Pending") {
    assetKind = "~~";
  } else if (status == "Rejected") {
    assetKind = "~~";
  }

and the directory of your own.

Then, change your Align Widget like this :

Align(
  alignment: AlignmentDirectional.center,
  child: Container(
  height: 55.0,
  child: Image.asset(assetKind),
),

CodePudding user response:

Do like this:

     Row(
    children:[
       
        status=="approved"?Icon(Icons.approve)
        
        :status=="pending"?Icon(Icons.pending):Icon(Icons.rejected)

         ]
       )

CodePudding user response:

You can use ternary operators to do this.

     Container(
      child: status == 'Approved'
          ? const ImageIcon(AssetImage('assets/icons/checked.png'))
          : status == 'Pending'
              ? const ImageIcon(AssetImage('assets/icons/pending.png'))
              : const ImageIcon(AssetImage('assets/icons/rejected.png')),
    );

or if you use enum for your status

import 'package:flutter/material.dart';

enum Status { approved, pending, rejected }

class DemoWidget extends StatelessWidget {
  const DemoWidget({super.key, required this.status});
  final Status status;

  @override
  Widget build(BuildContext context) {
    return Container(
      child: status == Status.approved
          ? const ImageIcon(AssetImage('assets/icons/checked.png'))
          : status == Status.pending
              ? const ImageIcon(AssetImage('assets/icons/pending.png'))
              : const ImageIcon(AssetImage('assets/icons/rejected.png')),
    );
  }
}
  • Related