Невозможно устранить эту ошибку: RangeError (index): недопустимое значение: диапазон допустимых значений пуст: 0 - PullRequest
0 голосов
/ 11 июля 2019

Я пытался создать приложение поблизости, которое я почти завершил, но затем появилась эта ошибка.Иногда приложение работает нормально, но иногда выдает ошибку времени компиляции, а иногда - ошибку времени выполнения.И я также искал эту проблему в Google, но, кажется, ничего не решает проблему. РЕДАКТИРОВАТЬ: Я нашел проблему.Всякий раз, когда я изменяю значение ползунка, значение изменяется в доли секунды, и API ничего не возвращает в эту долю секунды, поэтому возвращаемый результат равен нулю. Теперь мне нужно знать, как решить эту проблему.

Есть некоторые проблемы с Github, связанные с той же самой проблемой, и я также попробовал команду flutter clean, но это тоже, похоже, не решает проблему.

import 'package:flutter/material.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';
import 'package:clima/services/location.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  var lat;
  var lng;
  var _sliderValue = 1500.0;
  LatLng latlng = LatLng(
    -33.8670522,
    151.1957362,
  );
  Iterable markers = [];
  @override
  void initState() {
    super.initState();
    getData(_sliderValue);
  }

  getData(double radius) async {
    Location location = Location();
    await location.getCurrentLocation();
    lat = location.latitude;
    lng = location.longitude;
    try {
      http.Response response = await http.get(
          'https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=${latlng.latitude},${latlng.longitude}&radius=${radius.toInt()}&type=restaurant&key=API_KEY_HERE');

      final int statusCode = response.statusCode;

      if (statusCode == 201 || statusCode == 200) {
        Map responseBody = json.decode(response.body);
        List results = responseBody["results"];

        Iterable _markers = Iterable.generate(20, (index) {
          Map result = results[index];
          Map location = result["geometry"]["location"];
          LatLng latLngMarker = LatLng(location["lat"], location["lng"]);
          String name = result["name"];
          return Marker(
              markerId: MarkerId("marker$index"),
              position: latLngMarker,
              infoWindow: InfoWindow(title: name));
        });

        setState(() {
          markers = _markers;
        });
      } else {
        throw Exception('Error');
      }
    } catch (e) {
      print(e.toString());
    }
  }

  @override
  void dispose() {
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Column(
        children: <Widget>[
          Container(
            height: 100.0,
            width: MediaQuery.of(context).size.width,
            child: Slider(
              value: _sliderValue,
              min: 1000.0,
              max: 2000.0,
              divisions: 10,
              label: '${_sliderValue.round()}',
              onChanged: (double value) {
                _sliderValue = value;
                try {
                  setState(() {
                    getData(_sliderValue);
                  });
                } catch (e) {
                  print(e.toString());
                }
              },
            ),
          ),
          Expanded(
            child: GoogleMap(
              markers: Set.from(
                markers,
              ),
              initialCameraPosition: CameraPosition(target: latlng, zoom: 15.0),
              onMapCreated: (GoogleMapController controller) {},
            ),
          ),
        ],
      ),
    );
  }
}

Это журнал ошибок.

Performing hot restart...
Syncing files to device Android SDK built for x86...
Restarted application in 3,346ms.
I/Google Maps Android API(17370): Google Play services package version: 16089022
I/ppbrewery.clim(17370): NativeAlloc concurrent copying GC freed 3574(288KB) AllocSpace objects, 0(0B) LOS objects, 42% free, 8MB/14MB, paused 1.619ms total 344.118ms
W/System  (17370): A resource failed to call release. 
I/Choreographer(17370): Skipped 34 frames!  The application may be doing too much work on its main thread.
D/        (17370): HostConnection::get() New Host Connection established 0xbac40a80, tid 17764
D/EGL_emulation(17370): eglMakeCurrent: 0xee97e560: ver 2 0 (tinfo 0xee9318d0)
D/EGL_emulation(17370): eglCreateContext: 0xbfc3f820: maj 1 min 0 rcv 1
D/EGL_emulation(17370): eglMakeCurrent: 0xbfc3f820: ver 1 0 (tinfo 0xc8b39ce0)
I/flutter (17370): Lat: 37.4219983, Long: -122.084
I/ppbrewery.clim(17370): NativeAlloc concurrent copying GC freed 61451(2MB) AllocSpace objects, 16(372KB) LOS objects, 41% free, 8MB/14MB, paused 4.277ms total 249.993ms
I/flutter (17370): ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
I/flutter (17370): The following RangeError was thrown building MyHomePage(dirty, dependencies: [MediaQuery], state:
I/flutter (17370): _MyHomePageState#dfce2):
I/flutter (17370): RangeError (index): Invalid value: Valid value range is empty: 0
I/flutter (17370): 
I/flutter (17370): When the exception was thrown, this was the stack:
I/flutter (17370): #0      List.[] (dart:core-patch/growable_array.dart:145:60)
I/flutter (17370): #1      _MyHomePageState.getData.<anonymous closure> (package:clima/main.dart:79:31)
I/flutter (17370): #2      _GeneratorIterable.elementAt (dart:core/iterable.dart:689:12)
I/flutter (17370): #3      ListIterator.moveNext (dart:_internal/iterable.dart:343:26)
I/flutter (17370): #4      new LinkedHashSet.from (dart:collection/linked_hash_set.dart:100:27)
I/flutter (17370): #5      _MyHomePageState.build (package:clima/main.dart:136:28)
I/flutter (17370): #6      StatefulElement.build (package:flutter/src/widgets/framework.dart:3825:27)
I/flutter (17370): #7      ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3739:15)
I/flutter (17370): #8      Element.rebuild (package:flutter/src/widgets/framework.dart:3565:5)
I/flutter (17370): #9      BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2278:33)
I/flutter (17370): #10     _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&SemanticsBinding&RendererBinding&WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:700:20)
I/flutter (17370): #11     _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&SemanticsBinding&RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:286:5)
I/flutter (17370): #12     _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1012:15)
I/flutter (17370): #13     _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:952:9)
I/flutter (17370): #14     _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:864:5)
I/flutter (17370): #18     _invoke (dart:ui/hooks.dart:219:10)
I/flutter (17370): #19     _drawFrame (dart:ui/hooks.dart:178:3)
I/flutter (17370): (elided 3 frames from package dart:async)
I/flutter (17370): ════════════════════════════════════════════════════════════════════════════════════════════════════
E/BufferQueueProducer(17370): [SurfaceTexture-0-17370-9] cancelBuffer: BufferQueue has been abandoned
E/Surface (17370): queueBuffer: error queuing buffer to SurfaceTexture, -19
E/EGL_emulation(17370): tid 17412: swapBuffers(552): error 0x300d (EGL_BAD_SURFACE)
W/OpenGLRenderer(17370): swapBuffers encountered EGL error 12301 on 0xee97f2e0, halting rendering...
D/EGL_emulation(17370): eglMakeCurrent: 0xee97e560: ver 2 0 (tinfo 0xee9318d0)

1 Ответ

0 голосов
/ 13 июля 2019

Я бы изменил Iterable markers = []; на var markers = <Marker>[]; (то есть, было бы понятно, что это List)

Затем измените способ обработки на:

  var _markers = results.take(20).map<Marker>((result) {
    Map location = result['geometry']['location'];
    LatLng latLngMarker = LatLng(location['lat'], location['lng']);
    String name = result['name'];
    return Marker(
        markerId: MarkerId('marker$index'),
        position: latLngMarker,
        infoWindow: InfoWindow(title: name));
  }).toList();

Это позволяет создавать списки результатов длиной менее 20. Он отображает первые 20 результатов (меньше, если их меньше) в Marker s и формирует их обратно в список.

...