Flutter: ошибка при отображении одного значения списка

#flutter #listview #dart #text

#флаттер #listview #dart #текст

Вопрос:

В Flutter я считываю файл с диска и отображаю элементы списка в виде списка. Использование ListView.builder работает нормально, но с текстовым виджетом, отображающим одно значение, я получаю эту ошибку. Кто-нибудь может помочь?

Ошибка, которую я получаю, заключается в следующем Ошибка RangeError была вызвана созданием MyHomePage (dirty, состояние: _MyHomePageState #e9932): Ошибка RangeError (index): Недопустимое значение: Допустимый диапазон значений пуст: 9

 
 import 'package:flutter/material.dart';
 import 'dart:convert';
 import 'package:flutter/services.dart';
 import 'dart:async';
 
 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,
         visualDensity: VisualDensity.adaptivePlatformDensity,
       ),
       home: MyHomePage(),
     );
   }
 }
 
 ______________________________
 
         WITH List.View.builder
 
 class MyHomePage extends StatefulWidget {
   @override
   _MyHomePageState createState() => _MyHomePageState();
 }
 
 class _MyHomePageState extends State<MyHomePage> {
   List<String> _names = [];
 
   Future<List<String>> loadNames() async {
     List<String> names = [];
     await rootBundle.loadString('assets/Stulkur_A.txt').then((q) => {
           for (String i in LineSplitter().convert(q)) {names.add(i)}
         });
     return names;
   }
 
   _setup() async {
     List<String> names = await loadNames();
     setState(() {
       _names = names;
     });
   }
 
   @override
   void initState() {
     _setup();
     super.initState();
   }
 
   @override
   Widget build(BuildContext context) {
     return Scaffold(
       appBar: AppBar(
         title: Text('Names'),
       ),
       body: Center(
         child: Container(
             padding: EdgeInsets.all(15),
             child: ListView.builder(
                 itemCount: _names.length,
                 itemBuilder: (context, index) {
                   return Text(_names[index]);
                 })),
       ),
     );
   }
 }
 
 _____________________
 
 WITH Text widget
 
 class MyHomePage extends StatefulWidget {
   @override
   _MyHomePageState createState() => _MyHomePageState();
 }
 
 class _MyHomePageState extends State<MyHomePage> {
   List<String> _names = [];
 
   Future<List<String>> loadNames() async {
     List<String> names = [];
     await rootBundle.loadString('assets/Stulkur_A.txt').then((q) => {
           for (String i in LineSplitter().convert(q)) {names.add(i)}
         });
     return names;
   }
 
   _setup() async {
     List<String> names = await loadNames();
     setState(() {
       _names = names;
     });
   }
 
   @override
   void initState() {
     _setup();
     super.initState();
   }
 
   @override
   Widget build(BuildContext context) {
     return Scaffold(
       appBar: AppBar(
         title: Text('Names'),
       ),
       body: Center(
         child: Container(
           padding: EdgeInsets.all(15),
           child: Text(_names[9]),
         ),
       ),
     );
   }
 }

  

Комментарии:

1. Перезапустите приложение и выполните повторную загрузку, а также предоставьте нам реальный код

Ответ №1:

Попробуйте

 body: Center(
        child: Container(
          padding: EdgeInsets.all(15),
          child: _names.isEmpty
              ? CircularProgressIndicator()
              : ListView.builder(
                  itemCount: _names.length,
                  itemBuilder: (context, index) {
                    return Text(_names[index]);
                  },
                ),
        ),
      ),
  

Ответ №2:

Вы должны проверить, есть ли _names.длина == 0 покажите загрузчик или все, что вы хотите, в противном случае покажите виджет ListView.