skip to Main Content

I want to change the text background color to red when the current value for stock goes down and green color when stock goes up. I am using socket to receive stream data in flutter. Anyone has any idea to solve this? I will give an example of which I want.

I want my app to function like this

I tried to save the current value from socket locally but I didn’t get the expected result.

This is my code, I want to change the color according to the value:

So how do I compare the current value from socket?

SizedBox(
  width: deviceWidth / 8.101,
  height: deviceHieght / 17.14,
  child: StreamBuilder(
    stream: streamSocket.getGoldAskPriceResponse,
    initialData: 000,
    builder: (context, snapshot) {
      return Text(
        snapshot.data!.toString(),
        style: roboto(
          deviceWidth / 35.55,
          FontWeight.w600,
          FontStyle.normal,
          Colors.white,
        ),
        textAlign: TextAlign.left,
      );
    },
  ),
),

2

Answers


  1. Chosen as BEST ANSWER

    Thank you @beckzile for your logic,I have solved the issue,I initialized the value from stream to a variable with a slient delay and compared it with the current stream data,here is the solved code:-

                 SizedBox(
                  width: deviceWidth / 8.101,
                  height: deviceHieght / 17.14,
                  child: StreamBuilder(
                    stream: streamSocket.getGoldAskPriceResponse,
                    initialData: 000,
                    builder: (context, snapshot) {
                      Future.delayed(const Duration(milliseconds: 200),() => lastPrice == snapshot.data);
                      print("last price" + lastPrice.toString());
    
                      final change = snapshot.data ?? lastPrice;
                      if (change > lastPrice) color = Colors.green;
                      if (change < lastPrice) color = Colors.red;
    
                      print("change" + change.toString());
                      // Remove this line if you prefer to keep the previous color
                      if (change == lastPrice) color = Colors.transparent;
                      lastPrice = snapshot.data ?? 0;
                      return Container(
                        decoration: BoxDecoration(
                            borderRadius: BorderRadius.circular(6),
                            border: Border.all(
                              color: const Color.fromRGBO(96, 101, 130, 0.5),
                              width: 1,
                            ),
                            color: color),
                        child: Text(
                          snapshot.data!.toString(),
                          style: roboto(
                            deviceWidth / 35.55,
                            FontWeight.w600,
                            FontStyle.normal,
                            Colors.white,
                          ),
                          textAlign: TextAlign.center,
                        ),
                      );
    

  2. First of all, you need to store the previous value in a variable that you will be using to compare. You also need to have a variable to change the color accordingly.

    var lastPrice = 0;
    Color color = Colors.transparent;
    

    And then you need to refer to this value to calculate the difference and set the color.

    SizedBox(
      width: deviceWidth / 8.101,
      height: deviceHieght / 17.14,
      child: StreamBuilder(
        stream: streamSocket.getGoldAskPriceResponse,
        initialData: 000,
        builder: (context, snapshot) {
          final change = snapshot.data ?? lastPrice - lastPrice;
          if (change > 0) color = Colors.green;
          if (change < 0) color = Colors.red;
          // Remove this line if you prefer to keep the previous color
          if (change == 0) color = Colors.transparent;
          lastPrice = snapshot.data ?? 0;
          return Container(
            color: color,
            child: Text(
              snapshot.data!.toString(),
              style: roboto(
                deviceWidth / 35.55,
                FontWeight.w600,
                FontStyle.normal,
                Colors.white,
              ),
              textAlign: TextAlign.left,
            ),
          );
        },
      ),
    ),
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search