Календарь Flutter - отображение пользовательских данных по дням не работает - PullRequest
0 голосов
/ 10 июля 2020

Я использую флаттер с каруселью календаря (https://pub.dev/packages/flutter_calendar_carousel)

Для каждого дня, для которого есть запись в базе данных, я хочу отображать значок в календарь. Как лучше всего это сделать?

Это мой текущий код:

Пожалуйста, проверьте деталь с помощью customDayBuilder

class _CalendarScreenState extends State<CalendarScreen> {
  DateTime _currentDate;

  openNewEntryDialog(BuildContext context, date) {
    setState(() {
      _currentDate = date;
    });
    showBarModalBottomSheet(
        context: context,
        builder: (BuildContext context, scrollController) {
          return AddCalendarEntry(
            scrollController: scrollController,
            currentDate: _currentDate,
          );
        });
  }

  @override
  Widget build(BuildContext context) {
    final calendarEntriesData = Provider.of<CalendarEntries>(context);

    void initState() {
      _currentDate = widget._currentDate;
      super.initState();
    }

    dayPressed(date, events) {
      this.setState(() => _currentDate = date);
    }

    return Material(
        child: CupertinoPageScaffold(
            backgroundColor: Colors.white,
            navigationBar: CupertinoNavigationBar(
              trailing: IconButton(
                  icon: Icon(Icons.add),
                  color: Colors.white,
                  onPressed: () => openNewEntryDialog(context, DateTime.now())),
              middle: Text("Juni 2020",
                  style: Theme.of(context).appBarTheme.textTheme.headline1),
              backgroundColor: Theme.of(context).primaryColor,
            ),
            child: Padding(
              padding: const EdgeInsets.only(left: 15.0, right: 15.0),
              child: Column(
                children: <Widget>[
                  Expanded(
                    child: CalendarCarousel(
                      markedDateIconBorderColor: Theme.of(context).primaryColor,
                      weekdayTextStyle:
                          TextStyle(color: Theme.of(context).primaryColor),
                      daysTextStyle:
                          TextStyle(color: Theme.of(context).primaryColor),
                      todayButtonColor: Theme.of(context).primaryColor,
                      weekendTextStyle: TextStyle(color: Colors.black),
                      locale: "de",
                      selectedDayButtonColor: Colors.grey.shade100,
                      selectedDateTime: _currentDate,
                      headerTextStyle: TextStyle(
                          color: Theme.of(context).primaryColor, fontSize: 25),
                      onDayPressed: (DateTime date, List<Event> events) =>
                          dayPressed(date, events),
                      onDayLongPressed: (DateTime date) =>
                          openNewEntryDialog(context, date),
                      customDayBuilder: (bool isSelectable,
                          int index,
                          bool isSelectedDay,
                          bool isToday,
                          bool isPrevMonthDay,
                          TextStyle textStyle,
                          bool isNextMonthDay,
                          bool isThisMonthDay,
                          DateTime day) {
                        return FutureBuilder(
                            future: calendarEntriesData.getAll(),
                            builder: (BuildContext context,
                                AsyncSnapshot<List<CalendarEntry>> snapshot) {
                              if (!snapshot.hasData ||
                                  snapshot.connectionState ==
                                      ConnectionState.waiting) {
                                return Center(
                                  child: CircularProgressIndicator(),
                                );
                              } else {
                                for (final entry in snapshot.data) {
                                  var temp =
                                      DateTime.parse(entry.dateTime).toUtc();
                                  var d1 = DateTime.utc(
                                      temp.year, temp.month, temp.day);
                                  var d2 = DateTime.utc(
                                      day.year, day.month, day.day);
                                  if (d2.compareTo(d1) == 0) {
                                    return Center(
                                        child: Icon(Icons.local_airport));
                                  }
                                }
                              }
                            });
                      },
                    ),
                  ),
                  Expanded(
                      flex: 1,
                      child: Container(
                          margin: EdgeInsets.only(top: 35),
                          child: FutureBuilder<List<CalendarEntry>>(
                              future: calendarEntriesData
                                  .getCurrentMonthEntries(_currentDate != null
                                      ? _currentDate
                                      : DateTime.now()),
                              builder: (BuildContext context,
                                  AsyncSnapshot<List<CalendarEntry>> snapshot) {
                                if (!snapshot.hasData ||
                                    snapshot.connectionState ==
                                        ConnectionState.waiting) {
                                  return Center(
                                    child: CircularProgressIndicator(),
                                  );
                                } else {
                                  return Container(
                                      height: 100,
                                      child: ListView.builder(
                                          itemCount: snapshot.data.length,
                                          itemBuilder: (BuildContext context,
                                              int index) {
                                            return ListTile(
                                              title: Text(snapshot
                                                  .data[index].servicePartner
                                                  .toString()),
                                              subtitle: snapshot.data[index]
                                                          .dateTime ==
                                                      null
                                                  ? Text("Unbekannt")
                                                  : Text(DateFormat(
                                                          "dd.MM.yyyy")
                                                      .format(DateTime.parse(
                                                          snapshot.data[index]
                                                              .dateTime))),
                                              trailing: Text((snapshot
                                                              .data[index]
                                                              .minutes /
                                                          60)
                                                      .toString() +
                                                  " Stunden"),
                                            );
                                          }));
                                }
                              })))
                ],
              ),
            )));
  }
}

Как видите, я использую FutureBuilder для проверки всех записей в базе данных. И если день совпадает, я показываю значок в этот день. В целом это работает, но

  1. У меня есть ошибки на экране
  2. Производительность очень плохая, потому что есть некоторое мерцание ... при каждом щелчке в другой день виджет отображает полностью. Я не хочу этого.

введите описание изображения здесь

Как я могу улучшить свой код? Как я могу сделать это лучше?

Большое спасибо за вашу помощь!

...