Gabriel Bertollo
Gabriel Bertollo

Reputation: 23

Flutter toString() seems to be different on debug and release mode

This happened after migrating from Flutter 3.10.5 to 3.24.5.

I have a method on a class that uses a String with the information of what FontWeight to use. Basically, something like this:

final fontWightText = `w400`;
final fontWeight = FontWeight.values.firstWhere(
        (element) => element
            .toString()
            .endsWith(fontWeightText),
      ),

The problem is that, while running the app on release mode, this throws a Bad state: No element error. If I run on debug, it works fine. I noticed that if I print FontWeight.values.first on debug, I get FontWeight.w100, while on release I get Instance of 'FontWeight'.

I'm trying to find a workaround for this, but I also wonder if it might happen elsewhere on my app since it only happens if I run this new version of Flutter.

Upvotes: 2

Views: 70

Answers (2)

Duy Tran
Duy Tran

Reputation: 1149

Interesting question!

toString() will have a different output between debug vs release mode, like you said

It is by design to optimize and reduce a lot of extra information in output log

Basically logic code should not rely on this method since it is mostly just for logging

enter image description here

Upvotes: 2

il_boga
il_boga

Reputation: 1513

Hello and welcome to StackOverflow! As was pointed out in the comments, the toString implementation of FontWeight returns only constants values, so probably the issue is somewhere in your configuration. Maybe you need to update flutter, clear caches or something like that: I'd start by adding some print lines, so you can try do debug what's happening in release mode.

I scribbled up a MRE that you can run in a DartPad, so you can see that with the latest version of flutter it's running as supposed:

import 'package:flutter/material.dart';

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

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

  @override
  Widget build(BuildContext context) {
    final fontWeightText = 'w400';
    final fontWeight = FontWeight.values.firstWhere(
      (element) {
        print(element.hashCode() +' vs '+fontWeightText);
        return element.toString().endsWith(fontWeightText);
      },
    );
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        body: Center(
          child: Column(
            children: [
              Text('Hello, World!'),
              Text(
                'Hello, World!',
                style: TextStyle(fontWeight: fontWeight),
              )
            ],
          ),
        ),
      ),
    );
  }
}

Upvotes: 2

Related Questions