Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Listview RangeError(索引):无效值:不在范围0..30内,包括:-1_Listview_Flutter_Bloc - Fatal编程技术网

Listview RangeError(索引):无效值:不在范围0..30内,包括:-1

Listview RangeError(索引):无效值:不在范围0..30内,包括:-1,listview,flutter,bloc,Listview,Flutter,Bloc,我在第一次构建ScrollablePositionedList(日历)时遇到这个错误 最初,我声明一个空的列表日历=[],它用状态填充日期(我使用的是flatter_bloc),并调用一个方法来检查今天的日期是否在列表中,然后滚动到该索引,否则滚动到索引0(一个月的第一天) 除了Bloc的InitialState为空之外,我还有两种不同的状态,一种是TodayDate,用于在屏幕加载时在当前月份构建小部件,另一种是NewDate,用于在日历中更改月份时重建小部件 只有当收到TodayDate状态

我在第一次构建
ScrollablePositionedList
(日历)时遇到这个错误

最初,我声明一个空的
列表日历=[],它用状态填充日期(我使用的是flatter_bloc),并调用一个方法来检查今天的日期是否在列表中,然后滚动到该索引,否则滚动到索引0(一个月的第一天)

除了Bloc的InitialState为空之外,我还有两种不同的状态,一种是
TodayDate
,用于在屏幕加载时在当前月份构建小部件,另一种是
NewDate
,用于在日历中更改月份时重建小部件

只有当收到
TodayDate
状态时(请参见打印1),我才会收到错误,但当更改月份时,一切正常(请参见打印2和打印3)

我无法发现为什么在第一个小部件构建时它会抛出错误,因为可用数据与print3相同。 我最初认为这可能与
InitialState
为空有关,但随后
TodayDate
状态会随数据一起出现,应该会修复错误。此外,打印显示状态事务后的错误

你能看到我的实现中有什么错误吗? 一如既往,非常感谢您的时间和帮助


小装置:
scrollToIndex方法: 打印2:
NewDate
将月份更改为六月时的状态: 当更改月份并收到
NewDate
状态时,打印显示小部件正确更新,当更改回实际月份时,它的行为也与预期的跳到今天的日期一样。那么为什么
TodayDate
失败了,它携带了相同的数据,并且调用了与
NewDate
相同的scroll方法

更新: 使用
计时器
延迟调用
scrollToIndex
方法可以使其正常工作。希望这有助于了解问题所在

if (state is TodayDate) {
                  setState(() {
                    displayDate = state.newDate;
                    print(displayDate);
                    calendar = state.calendar;
                    isSelectedDay = state.isSelectedDay;
                    Timer(Duration(milliseconds: 50), () {
                      scrollToIndex(calendar);
                    });
                    // timer makes it work

// RangeError (index): Invalid value: Not in range 0..30, inclusive: -1
                  });
//                  scrollToIndex(calendar);
                }

@迪吉。谢谢你的编辑。很清楚,不用担心。希望你能找到答案!我当然会。。面团我对这一点很生气…只是滚动到今天…再次感谢。Cheerra一个小的解决方法是在收到第一个状态时给方法调用延迟50毫秒。@Diggy。谢谢你的编辑。很清楚,不用担心。希望你能找到答案!我当然会。。面团我对这一点很生气…只是滚动到今天…再次感谢。Cheerra一个小的解决方法是在接收第一个状态时给方法调用延迟50毫秒。。
if (state is TodayDate) {
                  setState(() {
                    displayDate = state.newDate;
                    print(displayDate);
                    calendar = state.calendar;
                    isSelectedDay = state.isSelectedDay;
                    scrollToIndex(
                        calendar); 
// RangeError (index): Invalid value: Not in range 0..30, inclusive: -1
                  });
                }
                if (state is NewDate) {
                  setState(() {
                    displayDate = state.newDate;
                    calendar = state.calendar;
                    isSelectedDay = state.isSelectedDay;
                    scrollToIndex(calendar); // works perfectly
//                    print('calendar is ${state.calendar}');
//                    print('isDaySelectedDay is ${state.isSelectedDay}');
                  });
                }
void scrollToIndex(List<DateTime> calendar) {
    print('scrollToIndex called');
    indexToScrollTo = 0;
    for (int index = 0; index < calendar.length; index++) {
      dateCheckIsToday.format(DateTime.now());
      if (dateCheckIsToday.format(calendar[index]) ==
          dateCheckIsToday.format(DateTime.now())) {
        indexToScrollTo = index;
        break;
      }
    }
    print('indexToScrolTo is: $indexToScrollTo');
    scrollController.jumpTo(
        index: indexToScrollTo); //, duration: Duration(seconds: 1));
  }

flutter: Event is GetMonth : {actual date :2020-05-17 08:08:41.044548}
flutter: Transaction is Transition { currentState: InitialState : { date: 2000-01-01 00:00:00.000, calendar : [], isSelected :[]}, event: GetMonth : {actual date :2020-05-17 08:08:41.044548}, nextState: TodayDate : { date: 2020-05-17 08:08:41.044548, calendar : [2020-05-01 00:00:00.000, 2020-05-02 00:00:00.000, 2020-05-03 00:00:00.000, 2020-05-04 00:00:00.000, 2020-05-05 00:00:00.000, 2020-05-06 00:00:00.000, 2020-05-07 00:00:00.000, 2020-05-08 00:00:00.000, 2020-05-09 00:00:00.000, 2020-05-10 00:00:00.000, 2020-05-11 00:00:00.000, 2020-05-12 00:00:00.000, 2020-05-13 00:00:00.000, 2020-05-14 00:00:00.000, 2020-05-15 00:00:00.000, 2020-05-16 00:00:00.000, 2020-05-17 00:00:00.000, 2020-05-18 00:00:00.000, 2020-05-19 00:00:00.000, 2020-05-20 00:00:00.000, 2020-05-21 00:00:00.000, 2020-05-22 00:00:00.000, 2020-05-23 00:00:00.000, 2020-05-24 00:00:00.000, 2020-05-25 00:00:00.000, 2020-05-26 00:00:00.000, 2020-05-27 00:00:00.000, 2020-05-28 00:00:00.000, 2020-05-29 00:00:00.000, 2020-05-30 00:00:00.0<…>
flutter: 2020-05-17 08:08:41.044548
flutter: scrollToIndex called
flutter: indexToScrolTo is: 16

════════ (4) Exception caught by widgets library ═══════════════════════════════════════════════════
RangeError (index): Invalid value: Not in range 0..30, inclusive: -1
════════════════════════════════════════════════════════════════════════════════════════════════════
flutter: Event is NextMonth : {actual date :2020-05-17 08:08:41.044548}
flutter: Transaction is Transition { currentState: TodayDate : { date: 2020-05-17 08:08:41.044548, calendar : [2020-05-01 00:00:00.000, 2020-05-02 00:00:00.000, 2020-05-03 00:00:00.000, 2020-05-04 00:00:00.000, 2020-05-05 00:00:00.000, 2020-05-06 00:00:00.000, 2020-05-07 00:00:00.000, 2020-05-08 00:00:00.000, 2020-05-09 00:00:00.000, 2020-05-10 00:00:00.000, 2020-05-11 00:00:00.000, 2020-05-12 00:00:00.000, 2020-05-13 00:00:00.000, 2020-05-14 00:00:00.000, 2020-05-15 00:00:00.000, 2020-05-16 00:00:00.000, 2020-05-17 00:00:00.000, 2020-05-18 00:00:00.000, 2020-05-19 00:00:00.000, 2020-05-20 00:00:00.000, 2020-05-21 00:00:00.000, 2020-05-22 00:00:00.000, 2020-05-23 00:00:00.000, 2020-05-24 00:00:00.000, 2020-05-25 00:00:00.000, 2020-05-26 00:00:00.000, 2020-05-27 00:00:00.000, 2020-05-28 00:00:00.000, 2020-05-29 00:00:00.000, 2020-05-30 00:00:00.000, 2020-05-31 00:00:00.000], isSelected :[false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, fals<…>
flutter: scrollToIndex called
flutter: indexToScrolTo is: 0
flutter: Event is PreviousMonth :{actual date :2020-06-17 00:00:00.000}
flutter: Transaction is Transition { currentState: NewDate : { date: 2020-06-17 00:00:00.000, calendar : [2020-06-01 00:00:00.000, 2020-06-02 00:00:00.000, 2020-06-03 00:00:00.000, 2020-06-04 00:00:00.000, 2020-06-05 00:00:00.000, 2020-06-06 00:00:00.000, 2020-06-07 00:00:00.000, 2020-06-08 00:00:00.000, 2020-06-09 00:00:00.000, 2020-06-10 00:00:00.000, 2020-06-11 00:00:00.000, 2020-06-12 00:00:00.000, 2020-06-13 00:00:00.000, 2020-06-14 00:00:00.000, 2020-06-15 00:00:00.000, 2020-06-16 00:00:00.000, 2020-06-17 00:00:00.000, 2020-06-18 00:00:00.000, 2020-06-19 00:00:00.000, 2020-06-20 00:00:00.000, 2020-06-21 00:00:00.000, 2020-06-22 00:00:00.000, 2020-06-23 00:00:00.000, 2020-06-24 00:00:00.000, 2020-06-25 00:00:00.000, 2020-06-26 00:00:00.000, 2020-06-27 00:00:00.000, 2020-06-28 00:00:00.000, 2020-06-29 00:00:00.000, 2020-06-30 00:00:00.000],isSelected :[false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, <…>
flutter: scrollToIndex called
flutter: indexToScrolTo is: 16
if (state is TodayDate) {
                  setState(() {
                    displayDate = state.newDate;
                    print(displayDate);
                    calendar = state.calendar;
                    isSelectedDay = state.isSelectedDay;
                    Timer(Duration(milliseconds: 50), () {
                      scrollToIndex(calendar);
                    });
                    // timer makes it work

// RangeError (index): Invalid value: Not in range 0..30, inclusive: -1
                  });
//                  scrollToIndex(calendar);
                }