Flutter GetX не может назначить Set<CustomClass> RxSet<CustomClass>

avatar
Patrik Szabó
8 августа 2021 в 20:13
256
1
0

Я разрабатываю приложение и столкнулся с проблемой, которая не вызывает ошибки, но меня очень расстраивает.

Ситуация такова, что у меня есть набор RxSet объектов CustomClass с инициализацией по умолчанию пустым набором. Когда я извлекаю данные с сервера, я хочу присвоить результат этому набору. Как предлагает GetX, я должен использовать myRxSet = dataFetchedFromServer. Это дает мне ошибку времени компиляции. myRxSet.value = dataFetchedFromServer все еще работает, но дает информацию, которую я не должен назначать свойству .value.

Пример кода можно увидеть ниже

RxSet<MyCustomClass> myCustomClassEntries = Set<MyCustomClass>().obs;

Future<void> syncData() async {
   myCustomClassEntries = await _fetchDataFromServer(); // this gives me compile time error
   myCustomClassEntries.value = await _ fetchDataFromServer(); // this gives me a warning that RxSet is not intented to be used this way.
}

Версия GetX: ^4.3.4 Версия флаттера: 2.2.3 Версия дротика: 2.13.4

Есть идеи, что я делаю не так?

Изменить


_fetchDataFromServer() не имеет значения в этой ситуации, просто хотел дать некоторый контекст проблеме. Все просто:

RxSet<MyCustomClass> myCustomClassEntries = Set<MyCustomClass>().obs;

// This line gives me a compile time error. It says Set<MyCustomClass> can't be assigned to RxSet<MyCustomClass>
myCustomClassEntries = new Set<MyCustomClass>();

// This line works, just like everywhere else with GetX, but says .value is no longer intented to be used on RxList, RxSet or RxMap. It recommends to use the syntax above, which gives the error.
myCustomClassEntries.value = new Set<MyCustomClass();

Из журнала изменений GetX

Изменение: Вам не нужно обращаться к свойству ".value" примитивов. Для строк вам нужна интерполяция. Для num, int, double у вас будут обычные операторы, и вы будете использовать их как типы дротика. Таким образом, .value можно использовать исключительно в классах моделей. Пример:

var name = "Jonny" .obs;
// usage:
Text ("$name");

var count = 0.obs;
// usage:
increment() => count ++;
Text("$count");

Таким образом: List, Map, Set, num, int, double и String в этом выпуске больше не будут использовать свойство .value.

ПРИМЕЧАНИЕ: изменения не были критическими, однако вы могли пропустить детали документации, поэтому, если вы столкнулись с сообщением: «Значение элемента может использоваться только в элементах экземпляра подклассов 'rx_list. dart'" вам просто нужно удалить свойство ".value" из вашего списка, и все будет работать как задумано. То же самое касается карт и наборов.

Источник
Loren.A
9 августа 2021 в 01:07
0

Какую ошибку вы получаете? Вы также должны поделиться функцией _fetchDataFromServer.

Patrik Szabó
9 августа 2021 в 09:10
0

Я дополнил описание необходимой информацией.

Ответы (1)

avatar
Loren.A
9 августа 2021 в 09:41
1

Короче говоря, при использовании list в Getx вам не нужно использовать .value.

...
myCustomClassEntries = Set<MyCustomClass>().obs; // just add .obs and treat it like a regular list. 
final object = MyCustomClass();
myCustomClassEntries.add(object); // no error here and not using .value

Я попросил функцию _fetchDataFromServer(), потому что она имеет значение в смысле того, что вы пытаетесь вернуть. Но в любом случае верните наблюдаемый Set<MyCustomClass>(), и тогда у вас не будет ошибок приведения типов.

Обновление после дополнительных вопросов:

Просто верните RxSet<MyCustomClass> из функции _fetchDataFromServer, чтобы получить соответствующие типы.

Future<RxSet<MyCustomClass>> _fetchDataFromServer() async {
  final tempList = Set<MyCustomClass>().obs;
// ... your code that populates list from server
  return tempList;
}

Вам не нужно очищать список. Ниже будет обновлено myCustomClassEntries только тем, что возвращается функцией.

myCustomClassEntries = await _fetchDataFromServer();
Patrik Szabó
9 августа 2021 в 10:32
0

_fetchDataFromServer() просто возвращает объект Set<MyCustomClass>. Это немного сбивает меня с толку. Некоторое время назад мне пришлось присвоить Set<MyCustomClass> свойству .value, но теперь я должен присвоить новый наблюдаемый объект Set<MyCustomClass>.obs? Это кажется несовместимым с журналом изменений, упомянутым выше.

Patrik Szabó
9 августа 2021 в 10:35
0

Я понимаю, что могу добавить в этот список, но если я хочу заменить все значения в списке, мне нужно использовать Set.clear() и Set.addAll()?

Patrik Szabó
9 августа 2021 в 20:39
0

Спасибо за ваше время, я использовал тот же подход сегодня. Список изменений все еще сбивает с толку. :( В любом случае, еще раз спасибо, я отмечу ваш ответ как решение.