1
votes

In Flutter I am reading a file from disk and displaying the list items as a list. Using ListView.builder works fine but with a text widget displaying a single value I get this error. Can someone help?

The error I get is The following RangeError was thrown building MyHomePage(dirty, state: _MyHomePageState#e9932): RangeError (index): Invalid value: Valid value range is empty: 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]),
         ),
       ),
     );
   }
 }

2
Restart you app and redebuge, and supplie us with the real code - Ahmed Elsayed

2 Answers

1
votes

Try

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

You should check if _names.length == 0 show a loader or everything you want otherwise show the ListView widget.