Сохранение многострочных строк в файл JSON из текстового поля - PullRequest
1 голос
/ 05 августа 2020

У меня есть приложение, которое дает пользователю возможность вводить и сохранять текст в TextField. Он отлично работает, если текст, введенный в TextField, является одной продолжающейся строкой. Если пользователь нажимает клавишу возврата / ввода для создания новой строки в TextField, он не сохраняется в файл JSON должным образом. Есть ли способ сохранить многострочный текст из файла TextField в файл JSON?

        Flexible(
            child: TextField(
            controller: _notesController,
            obscureText: false,
            maxLines: null,
            onChanged: (value) {
                // updates playterNotes to the text inputed
                playerList.players[index].playerNotes = value;
                
                // updates JSON file
                writePlayerData(playerList);
            },
            style: TextStyle(
                color: Color.fromRGBO(255, 174, 3, 1.0),
                letterSpacing: 2.0,
                fontSize: 14.0,
                fontFamily: 'Smash'
            ),
            ),
        )

Изменить: если файл JSON не сохраняется правильно, я загружаю заполнитель JSON .
Это JSON, распечатанный после начальной «однострочной»

I/flutter ( 4058): {"players":[{"id": "GitHub Test","setCount": "0 - 0","characters": {"char1": "cloud","char2": ""},"notes": "single line"}]} 

Это JSON, распечатанный после «многострочного» * ​​1012 *

I/flutter ( 4058): {"players":[{"id": "GitHub Test","setCount": "0 - 0","characters": {"char1": "cloud","char2": ""},"notes": "single line
I/flutter ( 4058): multi line"}]}

Тест
WritePlayerData:

Future<File> writePlayerData(PlayerList playerList) async {
  final file = await _localFile;
  return file.writeAsString(PlayerListtoJson(playerList));
}

Какой вызывает:

String PlayerListtoJson(PlayerList playerList) {
  String playerJson = "";

  if (playerList.players.length  > 0 ) {
    playerJson = '{"players":[${playerToJson(playerList.players)}]}';
  }
  return playerJson;
}

String playerToJson(List<Player> players) {
  String playerString = "";

  for(int i = 0; i < players.length; i++) {
    playerString += '{"id": "${players[i].playerId}",'
        '"setCount": "${players[i].playerSetCount}",'
        '"characters": ${characterToJson(players[i].playerChars)}'
        '"notes": "${players[i].playerNotes}"}';

    if (!(i == players.length - 1)) {
      playerString += ',';
    }
  }
  return playerString;
}

String characterToJson (Characters characters) {
  String playerCharacters = '{"char1": "${characters.char1}",'
      '"char2": "${characters.char2}"},';

  return playerCharacters;
}

Ссылка JSON:

{
  "players": [
    {
      "id": "Filler Character",
      "setCount": "0 - 0",
      "characters": {
        "char1": "",
        "char2": ""
      },
      "notes": "Lorem ipsum dolor sit amet, consectetur."
    }
  ]
}

1 Ответ

1 голос
/ 05 августа 2020

Вступите в новую строку с помощью \, чтобы кодировщик не вставлял новую строку в JSON созданный

String s = 'A\nB\nC';
print('$s');
//A
//B
//C
//escaping the new line with a additional "\"
s = s.split('\n').join('\\n');
//or
//s.replaceAll('\n', '\\n');
print('$s');
//A\nB\nC
...