如何从Flutter中的calendar_view包动态更新DayView Widget中的initialDay?

问题描述 投票:0回答:1

我正在 Flutter 应用程序中使用 calendar_view (https://pub.dev/packages/calendar_view) 包中的 DayView 小部件来显示选定日期的事件。每当从日历中选择新日期时,我想动态更新 DayView 的initialDay。然而,改变initialDay值似乎并没有更新DayView。

这是我的代码的简化版本:

import 'package:flutter/material.dart';
import 'package:calendar_view/calendar_view.dart';
import 'package:intl/intl.dart';

class HourlyView extends StatelessWidget {
  final List<EventModel> events;
  final DateTime initialDate;

  HourlyView({required this.events, required this.initialDate});

  @override
  Widget build(BuildContext context) {
    EventController eventController = EventController();

    // Map EventModel to CalendarEventData and add to controller
    events.forEach((event) {
      eventController.add(
        CalendarEventData(
          date: event.start,
          startTime: event.start,
          endTime: event.end,
          title: event.summary,
        ),
      );
    });

    return Container(
      color: Colors.black, // Set the background color to black
      child: DayView(
        controller: eventController,
        initialDay: initialDate,
        // Other properties...
      ),
    );
  }
}

即使初始日期已更新,DayView 也不会刷新以显示新日期。如何确保当initialDay改变时DayView正确更新?

其他背景:

  • 我正在使用 ValueNotifier 来处理日历视图中选定的日期更改。
  • DayView 小部件似乎使用正确的日期进行初始化,但不会动态更新。
flutter dart flutter-dependencies calendarview
1个回答
0
投票

嗨,我有同样的问题,具体的实现略有不同:

  • 我仅使用 StatefulWidget 来处理状态更改
  • 我使用 CalendarControllerProvider 来使用 TabBar 交替处理 DayView 和 WeekView

环境:

  • calendar_view(包)= v.1.2.0
  • 颤振= v.3.22.1

根据您的实现,我还尝试了以下代码。

我能够通过这个解决它

class CustomDayView<T extends Object?> extends DayView<T> {
  CustomDayView({
    super.key,
    super.controller,
    super.initialDay,
  });

  @override
  GlobalKey<DayViewState<T>> key = GlobalKey<DayViewState<T>>();
}

class HourlyView extends StatelessWidget {
  //... your code
  //... your code
  //... your code

  @override
  Widget build(BuildContext context) {
    //... your code
    //... your code
    //... your code

    return Container(
      color: Colors.black, // Set the background color to black
      child: CustomDayView(
        controller: eventController,
        initialDay: initialDate,
        // Other properties...
      ),
    );
  }
}

我创建了一个自定义类 CustomDayView ,它扩展了 DayView Widget

具体让它发挥作用的是这个

  @override
  GlobalKey<DayViewState<T>> key = GlobalKey<DayViewState<T>>();

我实际上不知道为什么它最终会起作用,我尝试阅读有关覆盖 GlobalKey 时它会做什么的内容,但我只是不明白,抱歉。

在想出上面的代码之前我尝试过做什么(注意:我已经尝试这样做但无法使其工作):

  • 跟踪 DayView Widget 及其 State Widget,检查是否有某种方法可以触发从包/库外部更改 _currentDate
  • 或者也许在我的日期状态更改后以某种方式调用jumpToPage或jumpToDate
  • 修补控制器是否可以被操纵或更改,以便它将根据我的状态更改触发日期基础

我不确定是否有更好的方法来处理这个问题,但现在我只会做我认为有效的事情。

抱歉,如果我的英语不好或者有任何拼写错误或语法错误,我实际上不知道,只是想分享我的想法。

© www.soinside.com 2019 - 2024. All rights reserved.