Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >table_calendar中的类型不匹配

table_calendar中的类型不匹配
EN

Stack Overflow用户
提问于 2021-06-18 20:59:00
回答 1查看 46关注 0票数 0

我正在将table_calendar插件添加到我的flutter应用程序中。到目前为止,多亏了我从你们那里得到的帮助,大多数事情都在运行。

这是我得到的下一个问题。当我点击日历上的日期时,我得到以下错误,然后什么也没有发生。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
======== Exception caught by gesture ===============================================================
The following _TypeError was thrown while handling a gesture:
type '_MapStream<QuerySnapshot<Map<String, dynamic>>, List<Event>>' is not a subtype of type 'Map<DateTime, List<dynamic>>'

When the exception was thrown, this was the stack: 
#0      _AppointmentCalendarScreenState._onDaySelected.<anonymous closure> (package:tonnah/screens/appointment_calendar.dart:73:29)

下面是第73行的代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void _onDaySelected(DateTime day, List events, List holidays) {
    _eventsStream = _firestoreService.getEventStream(day);
    setState(() {
      _streamController.add(_eventsStream);  <<<<< LINE 73
      //_selectedEvents = _eventsStream;
    });
  }

下面是我填充_eventsStream的位置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
_eventsStream = _firestoreService.getEventStream(_selectedDay);

Stream<List<Event>> getEventStream(DateTime dateTime) {
    return _db.collection('agency').doc(globals.agencyId).collection('event')
        .where('eventDate', isGreaterThanOrEqualTo: Timestamp.fromDate(dateTime))
        .snapshots().map((snapshot) => snapshot.docs
        .map((document) => Event.fromFirestore(document.data()))
        .toList());
  }

它还用于将事件指示器放在日历上:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  StreamBuilder(
    //stream: _firestoreService.getEventStream(_selectedDay),
    stream: _db.collection('agency').doc(globals.agencyId).collection('event')
  .where('eventDate', isGreaterThanOrEqualTo: Timestamp.fromDate(_selectedDay))
        .snapshots().map((snapshot) => snapshot.docs
  .map((document) => Event.fromFirestore(document.data()))
  .toList()),
    builder: (context, snapshot) {
      if (snapshot.hasData) {
        List<Event> snapData;
        //return snapData = snapshot.data;
        _eventsStream = snapshot.data;
        _eventsMap = convertToMap(_eventsStream);
        //_selectedEventsMap = _eventsMap[_selectedDay] ?? [];
        return _buildTableCalendar();
      } else {
        return CircularProgressIndicator();
      }
    },
  ),

我知道存在类型差异,但我如何使它们匹配?

以下是日历页面中的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Example holidays
final Map<DateTime, List> _holidays = {
  DateTime(2020, 1, 1): ['New Year\'s Day'],
  DateTime(2020, 1, 6): ['Epiphany'],
  DateTime(2020, 2, 14): ['Valentine\'s Day'],
  DateTime(2020, 4, 21): ['Easter Sunday'],
  DateTime(2020, 4, 22): ['Easter Monday'],
};

//final eventsRef = FirebaseFirestore.instance.collection('agency').doc(globals.agencyId).collection('event');
final _firestoreService = FirestoreService();
bool showSpinner = false;
var _eventsStream;
var _eventsMap;
final _selectedDay = DateTime.now();

class AppointmentCalendarScreen extends StatefulWidget {
  AppointmentCalendarScreen({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _AppointmentCalendarScreenState createState() => _AppointmentCalendarScreenState();
}

class _AppointmentCalendarScreenState extends State<AppointmentCalendarScreen> with TickerProviderStateMixin {
  //var _eventsList;
  //Map<DateTime, List> _selectedEventsMap;
  AnimationController _animationController;
  CalendarController _calendarController;
  StreamController<Map<DateTime, List>> _streamController;

  @override
  void initState() {
    super.initState();

    _streamController = StreamController();
    _eventsStream = _firestoreService.getEventStream(_selectedDay);
    _calendarController = CalendarController();
    _animationController = AnimationController(
      vsync: this,
      duration: const Duration(milliseconds: 400),
    );

    _animationController.forward();
  }

  @override
  void dispose() {
    _animationController.dispose();
    _calendarController.dispose();
    _streamController.close();

    super.dispose();
  }

  void _onDaySelected(DateTime day, List events, List holidays) {
    _eventsStream = _firestoreService.getEventStream(day);
    setState(() {
      _streamController.add(_eventsStream);
      //_selectedEvents = _eventsStream;
    });
  }

  void _onVisibleDaysChanged(DateTime first, DateTime last,
      CalendarFormat format) {
  }

  void _onCalendarCreated(DateTime first, DateTime last,
      CalendarFormat format) {
  }

  @override
  Widget build(BuildContext context) {
    final eventProvider = Provider.of<EventProvider>(context);
    FirebaseFirestore _db = FirebaseFirestore.instance;

    return Scaffold(
      appBar: AppBar(
        automaticallyImplyLeading: false,
        title: Row(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Image.asset('assets/images/Appbar_logo.png',
                fit: BoxFit.cover, height: 56),
          ],
        ),
      ),
      backgroundColor: Colors.white,
      resizeToAvoidBottomInset: false,
      body: Column(
        mainAxisSize: MainAxisSize.max,
        children: <Widget>[
          StreamBuilder(
            stream: _firestoreService.getEventStream(_selectedDay),
            builder: (context, snapshot) {
              if (snapshot.hasData) {
                List<Event> snapData;
                _eventsStream = snapshot.data;
                _eventsMap = convertToMap(_eventsStream);
                //_selectedEventsMap = _eventsMap[_selectedDay] ?? [];
                return _buildTableCalendar();
              } else {
                return CircularProgressIndicator();
              }
            },
          ),

          const SizedBox(height: 8.0),
          //_buildButtons(),
          ElevatedButton(
            onPressed: () async {
              setState(() {
                showSpinner = true;
              });
              try {
                globals.newAgency = true;

                //eventProvider.saveEvent();
                Navigator.of(context).pushReplacement(MaterialPageRoute(
                    builder: (context) => AddEventScreen()));

                setState(() {
                  showSpinner = false;
                });
              } catch (e) {
                // todo: add better error handling
                print(e);
              }
            },
            child: Text('Add Event'),
          ),
          const SizedBox(height: 8.0),
          Expanded(child: _buildEventList()),
        ],
      ),
    );
  }

  // Simple TableCalendar configuration (using Styles)
  Widget _buildTableCalendar() {
    return TableCalendar(
      calendarController: _calendarController,
      locale: 'en_US',
      events: _eventsMap,
      holidays: _holidays,
      startingDayOfWeek: StartingDayOfWeek.sunday,
      calendarStyle: CalendarStyle(
        selectedColor: Colors.deepOrange[400],
        todayColor: Colors.deepOrange[200],
        markersColor: Colors.deepPurpleAccent,
        outsideDaysVisible: false,
      ),
      headerStyle: HeaderStyle(
        formatButtonTextStyle:
        TextStyle().copyWith(color: Colors.white, fontSize: 15.0),
        formatButtonDecoration: BoxDecoration(
          color: Colors.deepOrange[400],
          borderRadius: BorderRadius.circular(16.0),
        ),
      ),
      onDaySelected: _onDaySelected,
      onVisibleDaysChanged: _onVisibleDaysChanged,
      onCalendarCreated: _onCalendarCreated,
    );
  }

  Widget _buildHolidaysMarker() {
    return Icon(
      Icons.add_box,
      size: 20.0,
      color: Colors.blueGrey[800],
    );
  }

  Widget _buildEventList() {
    final _db = FirebaseFirestore.instance;

    return Container(
      child: StreamBuilder<QuerySnapshot>(
        //stream: FirestoreService().getEvent(),
        stream: _db.collection('agency').doc(globals.agencyId).collection(
            'event').snapshots(),
        builder: (context, snapshot) {
          if (!snapshot.hasData) {
            return Center(
                child: const Text(
                  'Loading...',
                  style: TextStyle(
                      fontSize: 20, fontWeight: FontWeight.bold),
                ));
          } else {
            var doc = snapshot.data.docs;
            return new ListView.builder(
                itemCount: doc.length,
                itemBuilder: (BuildContext context, int index) {
                  Event _event = Event.fromFirestore(
                      doc[index].data());
                  return ListTile(
                    isThreeLine: true,
                    title: Text(
                      '${_event.eventName ?? 'n/a'}',
                      style: TextStyle(
                          fontWeight: FontWeight.w900,
                          color: Colors.blueAccent),
                    ),
                    subtitle: Text.rich(TextSpan(
                        text:
                        //'${_event.eventName ?? 'n/a'}, '
                        '${_event.eventStartTime ?? 'n/a'}, '
                            'Duration: ${_event.eventDuration ?? 'n/a'}',
                        children: <TextSpan>[
                          TextSpan(
                            text:
                            '\n${_event.eventDescription ?? 'n/a'}',
                            style: TextStyle(
                                fontWeight: FontWeight.w900,
                                color: Colors.blueGrey),
                          )
                        ])),
                    //trailing: Text('MLS#: ${_event.mlsNumber ?? 'n/a'}'),
                    onTap: () {
                      globals.newTrxn = false;
                      /*
                    Navigator.of(context).push(MaterialPageRoute(
                        builder: (context) =>
                            AddEventScreen(
                                doc[index].data())));

                     */
                    },
                  );
                }
            );
          }
        },

      ),
    );
  }

  Map<DateTime, List> convertToMap(List<Event> item) {
    Map<DateTime, List> result;

    for (int i = 0; i < item.length; i++) {
      Event data = item[i];
      //get the date and convert it to a DateTime variable
      //DateTime currentDate = DateFormat('MM-dd-yyyy - kk:mm').format(data.eventDate);
      DateTime currentDate = DateTime(data.eventDate.year, data.eventDate.month, data.eventDate.day, data.eventDate.hour, data.eventDate.minute);

      List eventNames = [];
      //add the event name to the the eventNames list for the current date.
      //search for another event with the same date and populate the eventNames List.
      for (int j = 0; j < item.length; j++) {
        //create temp calendarItemData object.
        Event temp = item[j];
        //establish that the temp date is equal to the current date
        if (data.eventDate == temp.eventDate) {
          //add the event name to the event List.
          eventNames.add(temp.eventName);
        } //else continue
      }

      //add the date and the event to the map if the date is not contained in the map
      if (result == null) {
        result = {
          currentDate: eventNames
        };
      } else {
        result[currentDate] = eventNames;
      }
      return result;
    }
  }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-19 09:33:38

你必须转换类型: Map。

创建将在“Map”上转换“_MapStream>,List>”的方法

在你的情况下:转换在'Map>

实际上,您需要以下三种方法:

首先:我上面提到的转换方法。方法示例如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
final int _currentYearInt = DateTime.now().year;
final int _currentMonthInt =
    int.parse(addZeroToNumberLowerThanTen(number: DateTime.now().month));


documentsList.forEach((doc) {
  Map<DateTime, List<Shift>> _schedule = {};
  
  // "days" is a properties with values: {"10" : [], "12": []}, where "10" is day of month"
  doc['days'].forEach((k, v) {
   
    int _shiftDay = int.parse(k);

    if (calendarWithMarkedDates[
            DateTime.utc(_currentYearInt, _currentMonthInt, _shiftDay)] ==
        null) {

      calendarWithMarkedDates[
          DateTime.utc(_currentYearInt, _currentMonthInt, _shiftDay)] = [];
    }


    calendarWithMarkedDates[DateTime.utc(_currentYearInt, _currentMonthInt, _shiftDay)]!
        .add( "your item. Can be object, map or what you want" );
  });


});

第二:"calendarWithMarkedDates“是一个LinkedHashMap,它保存所有标记的日期。F.e.来自服务器的响应日期: 1.07、5.07、12.07。转换为LinkedHashMap之后的所有日期都存储在这个"calendarWithMarkedDates“中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  final calendarWithMarkedDates = LinkedHashMap<DateTime, List<Shift>>(
    equals: isSameDay,
    hashCode: getHashCode,
  );

第三:"currentScheduleForDay“它是yu必须调用的函数,就像TableCalendar中没有参数的属性"eventLoader”的值一样。

这意味着:

currentScheduleForDay的好方法

错误的方法: currentScheduleForDay()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
List<Shift> currentScheduleForDay(DateTime day) {
  return currentCalendarWithMarkedDates[day] ?? []; 
}

当使用currentScheduleForDay方法(不带"()")时,TableCalendar by它自己循环遍历月份中的所有日期,并使用inovke方法遍历所有日期。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68041383

复制
相关文章
Codeigniter文件上传类型不匹配错误
Codeigniter的文件上传类方便了我们使用PHP来处理文件上传的操作,使用起来非常简单,如下:
大江小浪
2018/07/24
2.3K0
Spring问题研究之bean的属性xml注入List类型不匹配
为什么 String类型的列表 通过spring的属性注入 可以注入Integer类型的元素呢?
明明如月学长
2021/08/27
2.2K0
Access不匹配查询
大家好上节介绍了重复项查询,继续介绍选择查询中的不匹配项查询,不匹配查询也是在查询向导中创建。
无言之月
2020/06/04
2K0
Java中解决列名不匹配的两种方式
引用它的语句使用 resultMap 属性就行了(注意我们去掉了 resultType 属性)。比如:
用户8983410
2021/10/07
1.2K0
Nacos 中配置 Map 类型,不香!
最近在使用 Nacos 过程中遇到一个场景,配置的字符串可以解析成 Map 类型使用,有一个配置如下:
jinjunzhu
2022/09/23
3.2K0
Nacos 中配置 Map 类型,不香!
检测到“RuntimeLibrary”的不匹配项
错误是引用的是静态库,但是配置成动态库导致的,只需要修改成”多线程(/MT)“就可 这段错误的意思就是我调用的是静态库,但是我程序是dll动态,但是我这dll调用静态库就调用不成了吗? 解决方案如下
用户3519280
2023/07/08
1.2K0
Greenplum工具GPCC和GP日志中时间不匹配的问题分析
今天同事反馈了一个问题,之前看到没有太在意,虽然无伤大雅,但是想如果不重视,那么后期要遇到的问题就层出不穷,所以就作为我今天的任务之一来看看吧。能不能定位和解决,当然从事后来看,也算是找到了问题处理的一个通用思路。
jeanron100
2018/07/26
2.1K0
Greenplum工具GPCC和GP日志中时间不匹配的问题分析
偏差、方差和数据不匹配
Human-level指人类在目标问题上的error,比如人眼识别猫,人会识别错的error。
Steve Wang
2019/05/26
8980
R包更新过程中readr和cli不匹配
下面是学员解决问题的记录 (生信技能树学员 ) 自我介绍:我是一名儿科医生。硕士毕业工作已有十年的时候,在职博士还没有毕业方向,觉得生信学习或许是一个新的出口,于是跟随生信技能树的马拉松课程学习了数据挖掘,也学习了一些Linux的基础知识。一边忙碌的临床工作,一边挤时间学习这从未接触过的领域,到如今刚好一年,结合部分临床实验数据、数据挖掘生物信息分析等内容,终于完成了毕业论文的撰写。目前博士论文刚刚通过盲审评阅,等待着毕业收尾工作。非常感谢生信技能树的各位老师。 💡当你开始学习生信时,一定会遇到各种报
生信技能树
2022/06/08
3.3K0
R包更新过程中readr和cli不匹配
CA2017:参数计数不匹配
值 规则 ID CA2017 类别 可靠性 修复是中断修复还是非中断修复 非中断 原因 日志记录消息模板中提供的参数数目与命名占位符的数目不匹配。 规则说明 此规则标志记录器调用的消息参数数目不正确。 如何解决冲突 将模板格式的占位符的数量与传递的参数的数目匹配。 何时禁止显示警告 不禁止显示此规则发出的警告。 另请参阅 可靠性规则
用户4268038
2022/02/20
9060
【分享】解决Versal设计中NoC AXI的Cache Coherent类型匹配问题
检查设计,发现axi_noc_0的AXI端口S07_AXI的类型,在Connectivity页面被设置成了PS Cache Coherent模式,但在Block Design中它被连接到了A72的FPD_AXI端口,这不具备Cache Coherent能力。 在axi_noc_0的Connectivity页面,修改S07_AXI的类型为了PS Non-Coherent模式。重新验证,没有问题。
hankfu
2022/05/09
6180
pytorch训练的维度不匹配的问题,解决办法
扩展单张图片维度 import cv2 import torch image = cv2.imread(img_path) image = torch.tensor(image) print(image.size()) img = image.view(1,
AI拉呱
2021/03/03
2K0
Swift中的模式匹配
Swift 作为一门现代语言,除去安全,快速等特性之外,还有个明显有别于其他语言的特性,就是巨量细致入微的语言特性。类似iOS API,初学者觉得繁杂,无从下手,但是熟悉之后,绝对能少写不少代码。
小刀c
2022/09/21
1.8K0
expect中的正则匹配[通俗易懂]
注意.*在这里是贪婪匹配,也就是说会尽可能多的匹配 所以pattern的各个项对应关系:
全栈程序员站长
2022/11/01
1.2K0
less中的匹配模式
首先来看如下的代码,一个 div 元素,分别设置了上下左右的宽度高度和颜色,然后在浏览器中打开发现四个不同的角都是一个小小的三角形如下
程序员 NEO
2023/09/29
2240
less中的匹配模式
Rust中的模式匹配
在其它一些语言中,let x = 5 之类的语句,仅仅只是赋值语句。但是在rust中,可以换个角度理解,认为5这个值匹配到了x变量。如果觉得有些牵强,可以再来一个示例:
菩提树下的杨过
2021/11/30
1.8K0
Rust中的模式匹配
sed中的正则匹配
sed很早就支持正则表达式了,这在文件处理中非常有用,以下列出一些常见用法(GNU SED版本)。
生信编程日常
2020/06/29
7.5K0
error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“0”不匹配值“2”的解决方案
error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“0”不匹配值“2”(***.obj 中)
AIHGF
2019/02/18
5.7K0
你找到的LUT个数为什么和资源利用率报告中的不匹配
以Vivado自带的例子工程wavegen为例,打开布局布线后的DCP,通过执行report_utilization可获得资源利用率报告,如下图所示。其中被消耗的LUT个数为794。
Lauren的FPGA
2019/10/31
4.1K1
《搜索和推荐中的深度匹配》——经典匹配模型 2.1 匹配学习
已经提出了使用传统的机器学习技术进行搜索中的查询文档匹配和推荐中的用户项目匹配的方法。这些方法可以在一个更通用的框架内形式化,我们称之为“学习匹配”。除了搜索和推荐外,它还适用于其他应用,例如释义,问题解答和自然语言对话。本节首先给出学习匹配的正式定义。然后,它介绍了传统学习以匹配为搜索和推荐而开发的方法。最后,它提供了该方向的进一步阅读。
小爷毛毛_卓寿杰
2021/09/10
3.8K0

相似问题

模式匹配中抽象类型的类型不匹配

30

VBA中的类型不匹配

31

SQL中的类型不匹配

13

pytorch中的类型不匹配

232

数组中的类型不匹配

111
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文