Преобразовать из набора в список в Dart / Flutter?

У меня есть набор типа Set<WordPair>, и я хочу преобразовать его в список типа List<String>, потому что я хочу сохранить его с помощью SharedPreferences API во Flutter

В настоящее время мое состояние выглядит как

final Set<WordPair> _saved = Set<WordPair>();

Теперь я хочу сохранить переменную _saved в SharedPreferences

Если я это сделаю, prefs.setStringList('saved', _saved.toList()); это даст мне ошибку компиляции, например

[dart] Тип аргумента «Set» не может быть назначен типу параметра «List». [аргумент_типа_not_assignable]

Как сохранить полную _saved переменную в SharedPreferences?


person deadcoder0904    schedule 11.12.2018    source источник


Ответы (1)


Причина, по которой вы не можете сохранить его в настройках даже после преобразования в список, заключается в том, что вы пытаетесь сохранить StringList (prefs.setStringList), тогда как ваш набор имеет тип WordPair

Обходной путь для этого может быть,

prefs.setStringList('saved', _saved.map((WordPair wordPairItem) => wordPairItem.toString()).toList());

т.е. преобразование каждого элемента в String, а затем сохранение его как StringList

На ваш ответный вопрос в комментариях:

как мне преобразовать из List<String> в Set<WordPair> в initState? Поскольку нет .toWordPair(), и завершение занимает 2 аргумента, поэтому Idk, как это сделать?

Согласно документации, WordPair равно Representation of a combination of 2 words, first and second. Следовательно, вы можете разбить String на две подстроки и передать эти 2 подстроки в соответствующие позиции аргументов.

[Обновление] (решение, предложенное автором дополнительного вопроса) Решение можно найти по адресу здесь

person Daksh Gargas    schedule 11.12.2018
comment
Спасибо, Деннис. Это сработало. Как мне преобразовать List<String> в Set<WordPair> в initState? - person deadcoder0904; 11.12.2018
comment
Поскольку нет .toWordPair(), и завершение занимает 2 аргумента, поэтому Idk, как это сделать? - person deadcoder0904; 11.12.2018
comment
Согласно документации, WordPair представляет собой комбинацию двух слов, первого и второго. Следовательно, вы можете передать первый элемент списка в первом аргументе и пустую строку в следующем аргументе. - person Daksh Gargas; 11.12.2018
comment
Ах тым. Никогда бы не подумал об этом :) - person deadcoder0904; 11.12.2018
comment
Просто вопрос, а вы тоже asString метод пробовали? Я имею в виду, согласно документам, pub.dartlang.org/documentation/english_words / latest /, он должен быть в мире. - person Daksh Gargas; 11.12.2018
comment
Да, пробовал. Он выдал ошибку для asString (asString не является функцией, потому что это геттер), поэтому я изменил его на toString. Впрочем, без скобок работает :) - person deadcoder0904; 11.12.2018
comment
Ох, ладно. Прохладный. Прошу прощения, что не попробовал это на своей консоли, прежде чем ответить на вопрос. - person Daksh Gargas; 11.12.2018
comment
Не беспокойся, Деннис. На самом деле, у меня сейчас еще одна ошибка Invalid argument(s): Words of WordPair cannot be empty. Received: 'classleg', '', поэтому решение не работает - person deadcoder0904; 11.12.2018
comment
Разбейте строку на части и передайте в аргументы две подстроки. - person Daksh Gargas; 11.12.2018
comment
Да, сейчас я это делаю, я отредактирую ответ, когда закончу :) - person deadcoder0904; 11.12.2018
comment
Да, но это не эффективное решение, и его не следует делать в initState() - person Daksh Gargas; 11.12.2018
comment
Где мне тогда это делать? Мне нужны данные из настроек, когда я открываю приложение, и я думаю, что это нужно делать только в initState. Я новичок во Flutter, поэтому знаю, где еще это нужно сделать. Какие-нибудь решения? - person deadcoder0904; 11.12.2018
comment
Вы должны сделать это в initState, но решение, которое вы предложили, не так эффективно. Итак, вы должны сначала отобразить пользователю CircularProgressBar и выполнить эту задачу в фоновом потоке / изоляциях (в случае дротика). Но что не так с разделением String на две случайные подстроки? - person Daksh Gargas; 11.12.2018
comment
Я сделал две случайные подстроки, но это привело к странному отображению, потому что то, что я сохраняю, - это то, что я показываю. Я использую эту codelab плюс сохранение состояния с помощью SharedPreferences для добавления и удаления названий запусков. И когда я использовал две случайные подстроки, они выглядели странно, как HElloworld вместо HelloWorld :) - person deadcoder0904; 11.12.2018
comment
Позвольте нам продолжить это обсуждение в чате. - person Daksh Gargas; 11.12.2018
comment
Деннис, я оставил сообщение в чате - person deadcoder0904; 16.12.2018