【问题标题】:Passing a variable index to flutter widget将变量索引传递给颤振小部件
【发布时间】:2020-12-11 03:00:27
【问题描述】:

我是 Flutter 的新手,我正在尝试构建一个类似日历的视图。

我正在使用一些逻辑来生成周列表,显示为行,它们本身就是天列表(基本小部件)。

我遇到了一个障碍,将一个简单的索引传递给单个 Day 小部件以显示当天的数字。

虽然我已经学习了如何通过它们的构造函数将它们传递给小部件: CalendarDay({this.monthDay});,Dart 一直在抱怨,因为它们是通过逻辑生成的,所以索引值不是常量。

我用来生成 CalendarDay 小部件列表列表的逻辑:

    for(int rows =1,daysAdded=1; rows<=7;rows++) {
      for(int y=1;y<=7;y++){
        if(rows > 1 || y >= firstOfMonthWeekday){
          print("Adding day $daysAdded to week nr. $rows");
          final String str = daysAdded.toString();

          // This is where I try to pass the index to the CalendarDay Widget
          weeklyRow.add(new CalendarDay(monthDay: str)); 
          daysAdded++;
          if(daysAdded>daysInThisMonth){
            done = true;
            break;
          }
        }
      }
      monthWeeksDays.add(weeklyRow);
      weeklyRow = [];
      print('Days in week $rows: ${monthWeeksDays[rows-1].length}');
      if(done)
        break;
    }

CalendarDay 小部件本身:

class CalendarDay extends StatelessWidget {
  final String monthDay;
  CalendarDay({this.monthDay});

  @override
  Widget build(BuildContext context) {
    final double screenWidth = MediaQuery.of(context).size.width;
    return SizedBox(
      width: screenWidth/7,
      height: screenWidth/7,
      child: const DecoratedBox(
        decoration: BoxDecoration( color: Colors.blue),
        child: Center(
          child: Text(monthDay),
        ),
      ),
    );
  }
}

我已经尝试将 CalendarDay 转换为 StatefulWidget 以查看是否可以让我使用非常量值,但它仍然要求该值是常量,即使我从类声明中删除了 final 关键字。

除了没有索引之外,我不确定如何继续,如果有人能指出我解决问题的方法,我显然愿意自己研究它。谢谢。

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    尝试在CalendarDay({this.monthDay}); 之前添加const

    class CalendarDay extends StatelessWidget {
      final String monthDay;
      const CalendarDay({this.monthDay});
    
      @override
      Widget build(BuildContext context) {
        final double screenWidth = MediaQuery.of(context).size.width;
        return SizedBox(
          width: screenWidth/7,
          height: screenWidth/7,
          child: const DecoratedBox(
            decoration: BoxDecoration( color: Colors.blue),
            child: Center(
              child: Text(monthDay),
            ),
          ),
        );
      }
    }
    

    【讨论】:

    • 试过了,还是出现这两个错误: - 错误:创建常量的参数必须是常量表达式。 (const_with_non_constant_argument at [fridge_app] lib/calendar.dart:17) - 错误:对这个常量表达式的评估会引发异常。 ([fridge_app] lib/calendar.dart:17 处的 const_eval_throws_exception)
    • 通过在Text(monthDay), 之前添加new,错误更改为:error: Invalid constant value. (invalid_constant at [fridge_app] lib/calendar.dart:17).
    【解决方案2】:

    我是个白痴,我复制了一些代码来创建彩色框作为占位符,我花了好几个小时才注意到我将 DecoratedBox 声明为const

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-03
      • 2021-03-04
      • 2020-08-10
      • 1970-01-01
      • 2013-01-27
      • 1970-01-01
      相关资源
      最近更新 更多