RangeError (index): недопустимое значение: диапазон допустимых значений пуст: 0 (запрос http) - PullRequest
0 голосов
/ 13 февраля 2020

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

RangeError(index) : Invalid value : Valid value range is empty : 0

Это все сообщение об ошибке:

 Exception caught by widgets library ═══════════════════════════════════
The following RangeError was thrown building Builder:
RangeError (index): Invalid value: Valid value range is empty: 0

The relevant error-causing widget was
    MaterialApp 
package:chat/main.dart:180
When the exception was thrown, this was the stack
#0      List.[]  (dart:core-patch/growable_array.dart:149:60)
#1      _MyListScreenState.initState 
package:chat/main.dart:226
#2      StatefulElement._firstBuild 
package:flutter/…/widgets/framework.dart:4428
#3      ComponentElement.mount 
package:flutter/…/widgets/framework.dart:4274
#4      Element.inflateWidget 
package:flutter/…/widgets/framework.dart:3269
...
════════════════════════════════════════════════════════════════════════════════
Reloaded 1 of 591 libraries in 363ms.
flutter: 0

════════ Exception caught by widgets library ═══════════════════════════════════
The following RangeError was thrown building Builder:
RangeError (index): Invalid value: Valid value range is empty: 0

The relevant error-causing widget was
    MaterialApp 
package:chat/main.dart:180
When the exception was thrown, this was the stack
#0      List.[]  (dart:core-patch/growable_array.dart:149:60)
#1      _MyListScreenState.initState 
package:chat/main.dart:225
#2      StatefulElement._firstBuild 
package:flutter/…/widgets/framework.dart:4428
#3      ComponentElement.mount 
package:flutter/…/widgets/framework.dart:4274
#4      Element.inflateWidget 

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

ListView.builder(
        itemCount: deviceGet.length,
        itemBuilder: (context, index) {
        return ListTile(
                title: Text("Num $index " + device[index].commands[0].id));
         title: Text("Num $index " + deviceGet[index].name));

или если я поставлю

Text(deviceGet[0].name)

но с предупреждением

Это мой код:

import 'dart:convert';
import 'package:flutter/material.dart';

import 'Get.dart';
import 'Device.dart';
import 'Commands.dart';
import 'deviceData.dart';
void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  build(context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'My App',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyListScreen(),
    );
  }
}

class MyListScreen extends StatefulWidget {
  @override
  createState() => _MyListScreenState();
}

class _MyListScreenState extends State {
  //
  List<deviceData> dataDevice = deviceData.getDevicesData();

  List<DropdownMenuItem<deviceData>> listDropDevice;
  deviceData deviceSelection;
  //

  var deviceGet = new List<Device>();

  GetDevice() {
    GET.getDevice().then((response) {
      setState(() {
        Iterable list = json.decode(response.body);
        deviceGet = list.map((model) => Device.fromJson(model)).toList();
      });
    });
  }

  void initState() {
    super.initState();
    GetDevice();

    //print(deviceGet[0].name);

    // add in the dropDown
    for (int i = 0; i < 5;) {
      print(i);
      dataDevice.add(deviceData("Device" + i.toString()));
      dataDevice.add(deviceData(deviceGet[0].name));
      i = i + 1;
    }

    listDropDevice = buildDropdownMenuItems(dataDevice);
    deviceSelection = listDropDevice[0].value;
  }

  List<DropdownMenuItem<deviceData>> buildDropdownMenuItems(List devices) {
    List<DropdownMenuItem<deviceData>> items = List();
    for (deviceData device1 in devices) {
      items.add(
        DropdownMenuItem(
          value: device1,
          child: Text(device1.name),
        ),
      );
    }
    return items;
  }

  onChange(deviceData selectionUtilisateur) {
    setState(() {
      deviceSelection = selectionUtilisateur;
    });
  }

  @override
  build(context) {
    return Scaffold(
        appBar: AppBar(
          title: Text("Device List"),
        ),
        body: Column(children: <Widget>[
          //Text(deviceGet[0].name),
          DropdownButton(
            value: deviceSelection,
            items: listDropDevice,
            onChanged: onChange,
          ),
        ]));
  }
}

Спасибо за помощь

1 Ответ

1 голос
/ 13 февраля 2020

GetDevice () является асинхронным методом, поэтому требуется время для получения данных из json, а в начале deviceGet пусто, поэтому выдает ошибку диапазона.

вы можете сделать метод GetDevice () асинхронным, используя await и asyn c*, и при вызове этого метода используйте метод .then, а затем получите доступ к значениям.

также убедитесь, что вы получаете данные в GetDevice методич.

...