Home > Blockchain >  Expected a value of type 'string' but got one of type 'int' - Flutter
Expected a value of type 'string' but got one of type 'int' - Flutter

Time:10-06

I have a function that returns a String, but when I call this function, the app screen goes red and I get this error: Expected a value of type 'string' but got one of type 'int'.

Here is my function that returns a String:

  checkProportion(String predominantGamete, String resultado) {
    var countBrown = 0;
    var countBlack = 0;
    var countWhite = 0;
    var proportionCamundongo =
        'Proporção: ${countBrown}:${countBlack}:${countWhite}';

    if (predominantGamete == 'recessiva_aa' &&
        resultado.contains('A') &&
        resultado.contains('P')) {
      return countBrown  = 1;
    } else if (predominantGamete == 'recessiva_aa' &&
        resultado.contains('A') &&
        resultado.contains('pp')) {
      return countBlack  = 1;
    } else if (predominantGamete == 'recessiva_aa' &&
        resultado.contains('aa')) {
      return countWhite  = 1;
    }
    return proportionCamundongo;
  }

Here is how I call the function:

@override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Colors.transparent,
        elevation: 0,
        title: Text(
          checkProportion(widget.predominant, widget.result),
        ),
      ),

How to solve this error?

Here is an image that shows the colors of each result:

enter image description here

CodePudding user response:

The issue here is that you are returning early, not breaking the if statement, when you do something like return countBrown = 1;;

Try incrementing the counters, then using string interpolation to display the value:

String checkProportion(String predominantGamete, String resultado) {
  int countBrown = 0;
  int countBlack = 0;
  int countWhite = 0;

  if (predominantGamete == 'recessiva_aa' &&
    resultado.contains('A') &&
    resultado.contains('P')) {
    countBrown  = 1;
  } else if (predominantGamete == 'recessiva_aa' &&
    resultado.contains('A') &&
    resultado.contains('pp')) {
    countBlack  = 1;
  } else if (predominantGamete == 'recessiva_aa' &&
    resultado.contains('aa')) {
    countWhite  = 1;
  }
  return 'Proporção: ${countBrown}:${countBlack}:${countWhite}';
}

I'd also recommend specifing the return type of the function (String), using the correct types for counters (int). That will help your compiler catch the issues as well.

CodePudding user response:

It isn't my best work, and there is probably a better way to check for if a string contains all occurrence of multiple substrings, but here you go:

bool isColorContained(String resultado, Set<String> requirements) {
  for(String requirement in requirements) {
      if (!resultado.contains(requirement)) {
        return false;            
      }
    }
  return true;
}

 

String checkProportion(String predominantGamete, String resultado) {         
  Map<ColorType, Set<String>> colorType = {
    ColorType.brown: {'A', 'P'},
    ColorType.black: {'A', 'pp'},
    ColorType.white: {'aa'},
  };
  Map<ColorType, int> colorTypeCount = {
    ColorType.brown: 0,
    ColorType.black: 0,
    ColorType.white: 0,
  };
  for(MapEntry<ColorType, Set<String>> entry in colorType.entries )  {
    if(predominantGamete != 'recessiva_aa') continue;
    bool contained = isColorContained(resultado, entry.value);        
    if(contained) {
      int count = colorTypeCount[entry.key] ?? 0;
      colorTypeCount[entry.key] = count   1;
    }      
  }
  return 'Proporção: ${colorTypeCount[ColorType.brown]}:${colorTypeCount[ColorType.black]}:${colorTypeCount[ColorType.white]}';
}

  Also, declare the ColorType enum:

enum ColorType {
  brown, black, white
}

This will scale with as many colors and requirements you have, by adding to the ColorType enum, the colorType map, and the colorTypeCount map.

  • Related