Bool с json во флаттере - PullRequest
0 голосов
/ 25 мая 2020

Здравствуйте, я пытаюсь поместить переменную 'select', чтобы получить значение типа bool из файла Json. Я не могу сделать, чтобы кто-нибудь мог мне помочь (нет кода, все, что я могу получить, текст, но я не могу получить bool). Спасибо.

final _toDoController = TextEditingController();
  Map<String, dynamic> _toDoList = Map(); //change this.
  void initState() {
    super.initState();
    _readData().then((data) {
      setState(() {
        _toDoList = json.decode(data);
      });
    });
  }
  void _addToDo() {
    setState(() {
      Map<String, dynamic> newToDo = Map();
      newToDo['verificar'] = true;
      _toDoList.addAll(newToDo);
      _saveData();
    });
  }
  Widget build(BuildContext context) {
    bool selected = _toDoList['verificar'];
    return Scaffold(
...
      ),
      body: Container(
color: selected ? Colors.green.withOpacity(0.90) : Colors.deepOrangeAccent.withOpacity(0.90),
...
),
    );
  }
  Future<File> _getFile() async {
    final directory = await getApplicationDocumentsDirectory();
    return File("${directory.path}/data.json");
  }
  Future<File> _saveData() async {
    String data = json.encode(_toDoList);

    final file = await _getFile();
    return file.writeAsString(data);
  }
  Future<String> _readData() async {
    try {
      final file = await _getFile();

      return file.readAsString();
    } catch (e) {
      return null;
    }}}

1 Ответ

0 голосов
/ 26 мая 2020

Проблема в том, какой тип списка вы используете.

List _toDoList = []; //this returns an index based list. 

Map<String, dynamic> newTodo = Map(); //this list returns a list with a key and value pair

Решение состоит в том, чтобы либо изменить _toDoList с List на основе индекса на Map, либо получить доступ к списку с помощью index.

Map<String, dynamic> _toDoList = Map(); //change _toDoList to this
_toDoList.addAll(newToDo); //change to this
bool selected = _toDoList['verificar'] //this now works

или, с текущим кодом, как он есть, работает ниже.

bool selected _toDoList[0]['verificar'];

Подсказка: Распечатать тип запуска списка или переменная, чтобы увидеть, что это такое, тогда становится проще получить к ней доступ.

 print('a: ${_toDoList.runtimeType} : $_toDoList');
 print('b: ${_toDoList[0].runtimeType} : ${_toDoList[0]}');
 print('c: ${_toDoList[0]['verificar']}');

Map<String, dynamic> newToDo = Map();
newToDo['verificar'] = true;
Map<String, dynamic> _toDoList2 = Map();
_toDoList2.addAll(newToDo);

print('d: ${_toDoList2.runtimeType} : ${_toDoList2['verificar']}');

и посмотрите вывод, который сообщает вам, какой это тип списка: 1022 * В итоге , ниже работает

Map<String, dynamic> _toDoList = Map(); //change this.

  void initState() {
    super.initState();

    _readData().then((data) {
      setState(() {
        _toDoList = json.decode(data);
      });
    });
  }

  void _addToDo() {
    setState(() {
      Map<String, dynamic> newToDo = Map();
      newToDo['verificar'] = true;
      _toDoList.addAll(newToDo);

      _saveData();
    });
  }

  @override
  Widget build(BuildContext context) {

    bool selected = _toDoList[verificar];
...