Flutter DropdownButtonFormField не работает с длинными списками - PullRequest
0 голосов
/ 01 марта 2020

У меня есть форма с несколькими DropdownButtonFormField, и все они работают нормально, кроме одного, и это было довольно странно, так как выдает ошибку, не связанную с тем, что я обнаружил через некоторое время, устранение неполадок.

Ошибка была: (ошибка возникает при выборе элементов и setState)

items == null || value == null || items.where((DropdownMenuItem item) => item.value == value).length == 1': is not true.

Странная вещь, это на 100% уверен, что выбранное значение из списка, Как, как можно выбрать значение не в списке !!

Кроме того, у меня уже точно такой же DropdownButtonFormField работает нормально, но только с другими данными! с той же конечной точки API

Итак, я начинаю видеть разницу между этим DropdownButtonFormField и другим! и это была длина моих данных!

Рабочий выпадающий список содержал от 2 до 6 элементов, а тот, который не работал и выдает вышеуказанную ошибку при выборе, был более 50 элементов!

Поэтому я отредактировал свой бэкэнд и уменьшил массив до 6 элементов и DropdownButtonFormField снова заработал, но, конечно, это не решение, мне все еще нужны все мои +50 элементов в раскрывающемся списке !!

Код для виджета DropdownButtonFormField:

FutureBuilder(
  future: form,
  builder: (BuildContext context,
      AsyncSnapshot<Forms.Form> snapshot) {
    if (!snapshot.hasData) {
      return Padding(
        padding: null,
        child: Center(
          child: CircularProgressIndicator(),
        ),
      );
    } else {
      return DropdownButtonFormField(
        isExpanded: true,
        validator: (value) => value == null
            ? 'من فضلك اكمل الحقل المطلوب'
            : null,
        value: _selectedClass,
        hint: Text('الفرقة'),
        items:
            snapshot.data.classes.map((collageYear) {
          return DropdownMenuItem(
            value: collageYear.value,
            child: Text(collageYear.name),
          );
        }).toList(),
        onChanged: (val) {
          setState(() {
            _selectedClass = val;
          });
        },
      );
    }
  },
),

Мой доктор-флаттер -v:

[✓] Flutter (Channel stable, v1.12.13+hotfix.8, on Mac OS X 10.14.5 18F132, locale en-EG)
    • Flutter version 1.12.13+hotfix.8 at /Users/esham/Development/flutter
    • Framework revision 0b8abb4724 (3 weeks ago), 2020-02-11 11:44:36 -0800
    • Engine revision e1e6ced81d
    • Dart version 2.7.0


[!] Android toolchain - develop for Android devices (Android SDK version 29.0.2)
    • Android SDK at /Users/esham/Library/Android/sdk
    • Android NDK location not configured (optional; useful for native profiling support)
    • Platform android-29, build-tools 29.0.2
    • ANDROID_HOME = /Users/esham/Library/Android/sdk
    • ANDROID_SDK_ROOT = /Users/esham/Library/Android/sdk
    • Java binary at: /Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/bin/java
    • Java version OpenJDK Runtime Environment (build 1.8.0_202-release-1483-b49-5587405)
    ! Some Android licenses not accepted.  To resolve this, run: flutter doctor --android-licenses

[✓] Xcode - develop for iOS and macOS (Xcode 11.3.1)
    • Xcode at /Applications/Xcode.app/Contents/Developer
    • Xcode 11.3.1, Build version 11C504
    • CocoaPods version 1.8.4

[✓] Android Studio (version 3.5)
    • Android Studio at /Applications/Android Studio.app/Contents
    • Flutter plugin version 39.0.3
    • Dart plugin version 191.8423
    • Java version OpenJDK Runtime Environment (build 1.8.0_202-release-1483-b49-5587405)

[✓] VS Code (version 1.42.1)
    • VS Code at /Applications/Visual Studio Code.app/Contents
    • Flutter extension version 3.8.1

[✓] Connected device (1 available)
    • Redmi Note 8 Pro • hev4t4bqo7hyvsnf • android-arm64 • Android 9 (API 28)

! Doctor found issues in 1 category.

1 Ответ

1 голос
/ 01 марта 2020

Утверждение в dropdown.dart (которое вызывает сообщение об ошибке) следующее:

assert(items == null || items.isEmpty || value == null ||
          items.where((DropdownMenuItem<T> item) {
            return item.value == value;
          }).length == 1,
            'There should be exactly one item with [DropdownButton]\'s value: '
            '$value. \n'
            'Either zero or 2 or more [DropdownMenuItem]s were detected '
            'with the same value',
          ),

Как видите, оно говорит вам, что ни один из выбранных элементов не существует в списке ( что, я полагаю, может произойти, только если вы отредактировали значение в поле) или в вашем списке есть повторяющиеся элементы. Я предлагаю поместить оператор печати в ваш код сразу после

items: snapshot.data.classes.map((collageYear) {

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

PS. У меня есть выпадающий список с 250 элементами (хотя и из списка постоянных значений), который работает нормально, поэтому это не длина. Это должно быть проблема с данными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...