'RangeError (index) Flutter

I am getting an error and red screen while trying to click a button. RangeError (index): Invalid value: Valid value range is empty: 0. I do not know how to fix this error because nothing is flagged until I run my emulator. I have attached my emulation screen here If I need to add some code please let me know I am more than willing to. Thank you! home_page.dart

import 'package:flutter/material.dart';
import 'package:timestudy_test/pages/study_page.dart';
import 'package:timestudy_test/pages/timer_page.dart';
import 'package:timestudy_test/viewmodels/study_viewmodel.dart';

class HomePage extends StatefulWidget {
  @override
  State createState() => HomePageState();
}

class HomePageState extends State<HomePage> {
  TextEditingController textController = new TextEditingController();
  late String filter;

  @override
  void initState() {
    textController.addListener(() {
      setState(() {
        filter = textController.text;
      });
    });
    super.initState();
  }

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      resizeToAvoidBottomInset: false,
      appBar: AppBar(
        title: Text('TimeStudyApp'),
      ),
      body: Material(
        child: Column(
          children: <Widget>[
            Padding(
                padding: EdgeInsets.only(top: 8.0, left: 16.0, right: 16.0),
                child: TextField(
                  style: TextStyle(fontSize: 18.0),
                  decoration: InputDecoration(
                    prefixIcon: Icon(Icons.search),
                    suffixIcon: IconButton(
                      icon: Icon(Icons.close),
                      onPressed: () {
                        textController.clear();
                        FocusScope.of(context).requestFocus(FocusNode());
                      },
                    ),
                    hintText: "Search...",
                  ),
                  controller: textController,
                )),
            Expanded(
              child: StudyViewModel.studies.length > 0
                  ? ListView.builder(
                itemCount: StudyViewModel.studies.length,
                itemBuilder: (BuildContext context, int index) {
                  if (filter == null || filter == "") {
                    return buildRow(context, index);
                  } else {
                    if (StudyViewModel.studies[index].name
                        .toLowerCase()
                        .contains(filter.toLowerCase())) {
                      return buildRow(context, index);
                    } else {
                      return Container();
                    }
                  }
                },
              )
                  : Center(
                child: Text('No studies found!'),
              ),
            )
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        child: Icon(Icons.add),
        onPressed: () async {
          int? nullableInterger;

          Navigator.push(
              context,
              MaterialPageRoute(
                  builder: (context) => StudyPage(
                    title: 'Add a study',
                    selected: nullableInterger ?? 0,
                  )));
        },
      ),
    );
  }

  Widget buildRow(BuildContext context, int index) {
    return ExpansionTile(
      title: Text(StudyViewModel.studies[index].name, style: TextStyle(fontSize: 18.0)),
      children: <Widget>[
        ListView.builder(
          shrinkWrap: true,
          physics: ClampingScrollPhysics(),
          itemCount: StudyViewModel.studies[index].tasks.length,
          itemBuilder: (context, int taskIndex) {
            return ListTile(
              title: Text(StudyViewModel.studies[index].tasks[taskIndex].name),
              contentPadding: EdgeInsets.symmetric(horizontal: 32.0),
              subtitle: Text(
                  StudyViewModel.studies[index].tasks[taskIndex].elapsedTime),
              trailing: IconButton(
                icon: Icon(
                    Icons.timer
                ),
                onPressed: () async {
                  await Navigator.push(
                      context,
                      MaterialPageRoute(
                          builder: (context) => TimerPage(
                              task: StudyViewModel
                                  .studies[index].tasks[taskIndex])));
                },
              ),
            );
          },
        ),
        Row(
          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
          children: <Widget>[
            IconButton(
              icon: Icon(
                  Icons.edit
              ),
              onPressed: () async {
                Navigator.push(
                    context,
                    MaterialPageRoute(
                        builder: (context) => StudyPage(
                            title: StudyViewModel.studies[index].name,
                            selected: index)));
              },
            ),
            IconButton(
              icon: Icon(
                  Icons.delete
              ),
              onPressed: () async {
                await showDialog(
                    context: context,
                    builder: (context) {
                      return AlertDialog(
                        content: Text('Do you wish to delete this study?'),
                        actions: <Widget>[
                          FlatButton(
                            child: Text('Accept'),
                            onPressed: () async {
                              StudyViewModel.studies.removeAt(index);
                              await StudyViewModel.saveFile();
                              Navigator.of(context).pop();
                            },
                          ),
                          FlatButton(
                            child: Text('Cancel'),
                            onPressed: () {
                              Navigator.of(context).pop();
                            },
                          ),
                        ],
                      );
                    });
              },
            ),
          ],
        ),
      ],
    );
  }
}

study_page.dart

import 'package:flutter/material.dart';
import 'package:timestudy_test/models/study.dart';
import 'package:timestudy_test/models/task.dart';
import 'package:timestudy_test/viewmodels/study_viewmodel.dart';

class StudyPage extends StatefulWidget {
  final String title;
  final int selected;

  StudyPage({required this.title, required this.selected});

  @override
  State createState() => StudyPageState();
}

class StudyPageState extends State<StudyPage> {
  late Study study;
  late TextField nameField;
  TextEditingController nameController = new TextEditingController();
  late TextField taskNameField;
  TextEditingController taskNameController = new TextEditingController();

  @override
  void initState() {
    nameField = new TextField(
      controller: nameController,
      decoration: InputDecoration(
          labelText: 'Study name'),
    );
    taskNameField = new TextField(
      controller: taskNameController,
      decoration:
      InputDecoration(labelText: 'Task name'),
    );
    if(widget.selected != null) {
      study = StudyViewModel.studies[widget.selected];
      nameController.text = study.name;
    } else {
      study = new Study(
          name: "",
          tasks: <Task>[]
      );
    }
    super.initState();
  }

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        resizeToAvoidBottomInset: false,
        appBar: AppBar(
          title: Text(widget.title),
        ),
        body: Material(
            child: Padding(padding: EdgeInsets.all(16.0), child: Column(
              children: <Widget>[
                Padding(padding: EdgeInsets.only(bottom: 8.0), child: nameField),
                Row(
                  mainAxisAlignment: MainAxisAlignment.spaceBetween,
                  children: <Widget>[
                    Text('Tasks:', style: TextStyle(fontSize: 18.0),),
                    IconButton(
                      icon: Icon(Icons.add),
                      onPressed: () async {
                        await showDialog(
                            context: context,
                            builder: (context) {
                              return AlertDialog(
                                title: Text('Add a task'),
                                content: taskNameField,
                                actions: <Widget>[
                                  FlatButton(
                                    child: Text('Cancel'),
                                    onPressed: () {
                                      Navigator.of(context).pop();
                                    },
                                  ),
                                  FlatButton(
                                    child: Text('Accept'),
                                    onPressed: () {
                                      if(taskNameController.text == ""){
                                        errorDialog(context, 'Please enter a task name!');
                                      } else {
                                        setState(() {
                                          study.tasks.add(new Task(
                                              name: taskNameController.text,
                                              elapsedTime:
                                              StudyViewModel.milliToElapsedString(
                                                  0)));
                                          taskNameController.clear();
                                        });
                                        Navigator.of(context).pop();
                                      }
                                    },
                                  ),
                                ],
                              );
                            });
                      },
                    )
                  ],
                ),
                Expanded(
                  child: ListView.builder(
                    itemCount: study.tasks.length,
                    itemBuilder: (context, int index) {
                      return ListTile(
                        title: Text(study.tasks[index].name),
                        trailing: IconButton(
                          icon: Icon(Icons.delete),
                          onPressed: () {
                            setState(() {
                              study.tasks.removeAt(index);
                            });
                          },
                        ),
                      );
                    },
                  ),
                ), Spacer(),
                Center(
                    child: RaisedButton(
                      color: Theme.of(context).accentColor,
                      child: Text('Save'),
                      onPressed: () async {
                        if (nameController.text == "") {
                          errorDialog(context, 'Please enter a study name!');
                        } else {
                          if (study.tasks.length < 1) {
                            errorDialog(context, 'Please add at least one task!');
                          } else {
                            study.name = nameController.text;
                            if (widget.selected != null) {
                              StudyViewModel.studies[widget.selected] = study;
                              await StudyViewModel.saveFile();
                              Navigator.of(context).pop();
                            } else {
                              if (StudyViewModel.checkName(nameController.text)) {
                                errorDialog(context, 'Study name already taken!');
                              } else {
                                StudyViewModel.studies.add(study);
                                await StudyViewModel.saveFile();
                                Navigator.of(context).pop();
                              }
                            }
                          }
                        }
                      },
                    ))
              ],
            ),
            )));
  }

  void errorDialog(BuildContext context, String message) async {
    await showDialog(
        context: context,
        builder: (context) {
          return AlertDialog(
            content: Text(message),
            actions: <Widget>[
              FlatButton(
                child: Text('Close'),
                onPressed: () {
                  Navigator.of(context).pop();
                },
              )
            ],
          );
        }
    );
  }
}


Solution 1:[1]

floatingActionButton: FloatingActionButton(
        child: Icon(Icons.add),
        onPressed: () async {
          int? nullableInterger; 
// the issue is here you need to assign value
// the nullableInterger is use here as nothing.. declare it on state level and
// assign it when your listview builder done so the value of nullable integer is
// changed and passing value as argument will not be 0 and this error will not appear again

          Navigator.push(
              context,
              MaterialPageRoute(
                  builder: (context) => StudyPage(
                    title: 'Add a study',
                    selected: nullableInterger ?? 0,
                  )));
        },
      ),

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Ameer Hamza