jonataslaw / getx

Open screens/snackbars/dialogs/bottomSheets without context, manage states and inject dependencies easily with Get.
MIT License
10.33k stars 1.62k forks source link

RxList<String> .contains returns error #901

Closed ElegantSoft closed 3 years ago

ElegantSoft commented 3 years ago

I want to check if item in a list already exists and it give me error that I tried to get length of null

class HomeController extends GetxController {
  RxList<String> favorites = <String>[].obs;
  final RxList<PageModel.Page> pages = [...appPages].obs;

  @override
  onInit() {
    super.onInit();
    getFavoritesFromStorage();
  }

  void getFavoritesFromStorage() async {
    try {
      SharedPreferences sharedPref = await SharedPreferences.getInstance();
      favorites = sharedPref.getStringList(FAVORITES).obs;
    } catch (e, stack) {
      debugPrint("$e $stack");
    }
  }

  void toggleFavorite(int pageNumber) async {
    SharedPreferences sharedPref = await SharedPreferences.getInstance();
    if (favorites.contains(pageNumber.toString())) { // here goes the error 
      favorites.remove(pageNumber.toString());
    } else {
      favorites.add(pageNumber.toString());
    }
    await sharedPref.setStringList(FAVORITES, favorites);
  }

  isInFavorite(int number) {
    return false;
  }
}

To Reproduce Steps to reproduce the behavior:

  1. Go to '...'
  2. Click on '....'
  3. Scroll down to '....'
  4. See error
E/flutter ( 6690): [ERROR:flutter/lib/ui/ui_dart_state.cc(177)] Unhandled Exception: NoSuchMethodError: The getter 'length' was called on null.
E/flutter ( 6690): Receiver: null
E/flutter ( 6690): Tried calling: length
E/flutter ( 6690): #0      Object.noSuchMethod (dart:core-patch/object_patch.dart:51:5)
E/flutter ( 6690): #1      RxList.length (package:get/get_rx/src/rx_types/rx_iterables/rx_list.dart:71:27)
E/flutter ( 6690): #2      ListMixin.contains (dart:collection/list.dart:125:23)
E/flutter ( 6690): #3      HomeController.toggleFavorite (package:love_secrets/app/modules/home/controllers/home_controller.dart:30:19)
E/flutter ( 6690): <asynchronous suspension>
E/flutter ( 6690): #4      Favorites.build.<anonymous closure> (package:love_secrets/app/modules/home/views/home_view.dart:79:32)
E/flutter ( 6690): #5      GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:183:24)
E/flutter ( 6690): #6      TapGestureRecognizer.handleTapUp (package:flutter/src/gestures/tap.dart:598:11)
E/flutter ( 6690): #7      BaseTapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:287:5)
E/flutter ( 6690): #8      BaseTapGestureRecognizer.acceptGesture (package:flutter/src/gestures/tap.dart:259:7)
E/flutter ( 6690): #9      GestureArenaManager.sweep (package:flutter/src/gestures/arena.dart:157:27)
E/flutter ( 6690): #10     GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:362:20)
E/flutter ( 6690): #11     GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:338:22)
E/flutter ( 6690): #12     RendererBinding.dispatchEvent (package:flutter/src/rendering/binding.dart:267:11)
E/flutter ( 6690): #13     GestureBinding._handlePointerEvent (package:flutter/src/gestures/binding.dart:295:7)
E/flutter ( 6690): #14     GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:240:7)
E/flutter ( 6690): #15     GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:213:7)
E/flutter ( 6690): #16     _rootRunUnary (dart:async/zone.dart:1206:13)
E/flutter ( 6690): #17     _CustomZone.runUnary (dart:async/zone.dart:1100:19)
E/flutter ( 6690): #18     _CustomZone.runUnaryGuarded (dart:async/zone.dart:1005:7)
E/flutter ( 6690): #19     _invoke1 (dart:ui/hooks.dart:265:10)
E/flutter ( 6690): #20     _dispatchPointerDataPacket (dart:ui/hooks.dart:174:5)
E/flutter ( 6690): 
SchabanBo commented 3 years ago

Please be sure that the result of

 sharedPref.getStringList(FAVORITES).obs

is not null. try

 (sharedPref.getStringList(FAVORITES) ?? <String>[] ).obs
ElegantSoft commented 3 years ago

I get same error when tries to do anything with favorites, I fixed it by use

final RxList<String> favorites = <String>[].obs;
ElegantSoft commented 3 years ago

after using final I rewrite the favorites by calling clear method then add items