日历

Flutter 的日历小部件。

展示了事件的滚动日历列表。这仍然相对基础,它始终假定 getEvents 返回整个日历事件列表(基本上忽略了传递给源的值)。不过,它确实有效:) 目前,它还假定 assets/images/calendarheader.png 存在,它将使用它来显示标题,并且 assets/images/calendarbanner.jpg 存在,它将使用它来显示月份标题。

日历使用 slivers 在视图中显示小部件,并允许您向前和向后滚动事件。标题小部件会下拉并打开月份的日期,让您选择特定日期以及在月份之间来回移动。默认情况下,它显示事件列表而不是日期视图,日期视图代码目前只是一个存根。

如何使用日历小部件本身

new CalendarWidget(
              initialDate: new TZDateTime.now(local),
              source: _calendarState,
            );

如何为日历小部件设置源。

class GameListCalendarState extends CalendarSource {
  List<Game> _listToShow;
  StreamSubscription<UpdateReason> _listening;

  @override
  Widget buildWidget(BuildContext context, CalendarEvent event) {
    return new GameCard(_listToShow[event.index]);
  }

  @override
  List<CalendarEvent> getEvents(DateTime start, DateTime end) {
    if (_listToShow == null) {
      _listToShow = UserDatabaseData.instance.games.values.toList();
    }
    if (_listToShow == null) {
      return [];
    }
    List<CalendarEvent> events = new List<CalendarEvent>();
    int pos = 0;
    _listToShow.forEach((Game g) => events.add(new CalendarEvent(
        instant: g.tzTime, instantEnd: g.tzEndTime, index: pos++)));
    return events;
  }

  @override
  void initState() {
    _listToShow = UserDatabaseData.instance.games.values.toList();
    _listening = UserDatabaseData.instance.gameStream.listen((UpdateReason r) {
      _listToShow = UserDatabaseData.instance.games.values.toList();
      state.updateEvents();
    });
  }

  @override
  void dispose() {
    _listening.cancel();
  }

  Future<void> loadGames(FilterDetails details) async {
    Iterable<Game> list = await UserDatabaseData.instance.getGames(details);

    _setGames(list);
  }

  void _setGames(Iterable<Game> res) {
    List<Game> games = res.toList();
    games.sort((a, b) => a.time.compareTo(b.time));

    _listToShow = games;
  }
}

日历小部件的示例

GitHub

https://github.com/pinkfish/flutter_calendar