Flutter - Как преобразовать Map<String, String> из TextEditingController в Map<String, dynamic> JSON

У меня около 40 полей TextFormField, и я получаю их значения с помощью TextEditingController. Значения преобразуются в карту Map<String, String> с помощью следующего шага:

// map that stores controllers
Map<String, TextEditingController> storeControllers = controllers;

// convert to map that stores only controller texts
Map<String, String> currentSelections = storeControllers
      .map((key, value) => MapEntry(key, storeControllers[key]!.text))

Текущий вывод со всеми значениями в типе String:

//currentSelections map
Map<String, String>
{
    "field1": "1",
    "field2": "Two",
    "field3": "0.03",
     ...
    "field40": "four40",
}

Как преобразовать карту currentSelections в JSON, в котором значения хранятся в соответствующих типах?

//Desired output:
Map<String, dynamic>
{
    "field1": 1, //int
    "field2": "Two", //String
    "field3": 0.03, //double
    ...
    "field40": "four40", //String
}

Любая помощь будет оценена по достоинству! :)

Я понимаю, что для преобразования строк в другие типы используется метод int.parse("text"). Но как мне это сделать с таким количеством разных типов?

Шаблоны Angular PrimeNg
Шаблоны Angular PrimeNg
Как привнести проверку типов в наши шаблоны Angular, использующие компоненты библиотеки PrimeNg, и настроить их отображение с помощью встроенной...
Создайте ползком, похожим на звездные войны, с помощью CSS и Javascript
Создайте ползком, похожим на звездные войны, с помощью CSS и Javascript
Если вы веб-разработчик (или хотите им стать), то вы наверняка гик и вам нравятся "Звездные войны". А как бы вы хотели, чтобы фоном для вашего...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Начала с розового дизайна
Начала с розового дизайна
Pink Design - это система дизайна Appwrite с открытым исходным кодом для создания последовательных и многократно используемых пользовательских...
Шлюз в PHP
Шлюз в PHP
API-шлюз (AG) - это сервер, который действует как единая точка входа для набора микросервисов.
14 Задание: Типы данных и структуры данных Python для DevOps
14 Задание: Типы данных и структуры данных Python для DevOps
проверить тип данных используемой переменной, мы можем просто написать: your_variable=100
0
0
56
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете использовать метод map, чтобы пройтись по каждому элементу и применить его при необходимости.

bool isInt(num value) => (value % 1) == 0;

final Map<String, dynamic> desireddMap = currentMap.map((key, value) {
    dynamic newValue = value;

    // Check if value is a number
    final numVal = num.tryParse(value);
    if (numVal != null) {
      // If number is a int, cast it to int
      if (isInt(numVal)) {
        newValue = numVal.toInt();
      } else {
        // Else cast it to double
        newValue = numVal.toDouble();
      }
    }

    return MapEntry(key, newValue);
  });
Ответ принят как подходящий

Может с этим попробовать

Map<String, dynamic> convert(Map<String, String> map) {
  return {
    for (final entry in map.entries)
      entry.key: int.tryParse(entry.value) ??
          double.tryParse(entry.value) ??
          entry.value
  };
}

Пример:

import 'dart:convert';

void main() {
  Map<String, String> map = {
    "field1": "1",
    "field2": "Two",
    "field3": "0.03",
    "field40": "four40",
  };

  final newMap = convert(map);

  print(jsonEncode(newMap));

  //output: {"field1":1,"field2":"Two","field3":0.03,"field40":"four40"}
}

Другие вопросы по теме