在 flutter 中自定义 DateRangePicker

Customize DateRangePicker in flutter

我想在flutter中自定义DateRangePicker,请问如何更改以下元素?

  1. Save 按钮更改为图像。
  2. 删除 Switch to input 按钮。
  3. 更改 header background 颜色。
  4. 更改 day name 颜色。
  5. 更改 background 颜色。
  6. 更改 selected item indicator 颜色。
  7. 更改 selected item text 颜色。
  8. 更改 selected range indicator 颜色。
  9. 更改 selected range text 颜色。
showDateRangePicker(
  context: context,
  firstDate: DateTime.now(),
  lastDate: DateTime.now().add(Duration(days: 100)),
  builder: (BuildContext context, Widget child) {
    return Theme(
      data: ThemeData(
        ...
      ),
      child: child,
    );
  },
);

对于该级别的自定义,您需要获取源代码,复制它,然后制作您自己的小部件修改该源代码。

您可以通过两种方式做到这一点:

@Michael Feinstein 是对的 - 详细说明你必须做什么:

  1. 您需要将 date_range_picker_dialog.dart 复制到您的 lib 文件夹中(您可以通过在 showDateRangePicker()
  2. 上单击 'go to implementation' 来到达那里
  3. 您需要复制 calendar_date_range_picker.dart(~ date_range_picker_dialog.dart 的第 577 行是实际选择器小部件作为对话框主体返回的地方)
  4. 您需要在两个文件中进行您想要的调整。您的数字 1-3 在对话框中,查看 class _CalendarRangePickerDialog 并更改您需要的内容。对于 6-9 岁,请查看范围选择器文件中的 _buildDayItem,其他 2 个也很容易找到 :-)
  5. 不要忘记更改 date_range_picker_dialog.dart 副本中的导入,以便导入 date_range_picker.dart 副本,而不是原始副本。

现在一切就绪,可以开始了。

这些东西大部分只能通过修改源来改变,正如其他人之前所说的那样。 您可以通过在 showDateRangePicker 的构建器回调中应用 appBarTheme 来更改 header 背景颜色。 文本颜色和选择颜色也可以通过应用主题来设置,您需要使用 ColorScheme 来设置它们。 此示例将 header 背景设置为蓝色,将关闭图标设置为白色,将 header 文本 + 所选日期文本设置为白色,将选择颜色设置为红色:

final themeData = Theme.of(context);
showDateRangePicker(
      context: context,
      initialDateRange: initialDateRange,
      firstDate: firstDate,
      lastDate: lastDate,
      currentDate: currentDate,
      initialEntryMode: initialEntryMode,
      helpText: helpText,
      cancelText: cancelText,
      confirmText: confirmText,
      saveText: saveText,
      errorFormatText: errorFormatText,
      errorInvalidText: errorInvalidText,
      errorInvalidRangeText: errorInvalidRangeText,
      fieldStartHintText: fieldStartHintText,
      fieldEndHintText: fieldEndHintText,
      fieldStartLabelText: fieldStartLabelText,
      fieldEndLabelText: fieldEndLabelText,
      locale: locale,
      useRootNavigator: useRootNavigator,
      routeSettings: routeSettings,
      textDirection: textDirection,
      builder: (context, Widget? child) => Theme(
            data: themeData.copyWith(
                appBarTheme: themeData.appBarTheme.copyWith(
                    backgroundColor: Colors.blue,
                    iconTheme: themeData.appBarTheme.iconTheme!.copyWith(color: Colors.white)),
                colorScheme: ColorScheme.light(
                  onPrimary: Colors.white,
                  primary: Colors.red
                )),
            child: child!,
          ));

Screenshot

我在下面复制了如何更改您在颜色自定义方面询问的几乎所有内容:

showDateRangePicker(
  context: context,
  firstDate: DateTime.now(),
  lastDate: DateTime.now().add(Duration(days: 100)),
  builder: (BuildContext context, Widget child) {
          return Theme(
            data: ThemeData.light().copyWith(
              //Header background color
              primaryColor: Colors.blue,
              //Background color
              scaffoldBackgroundColor: Colors.grey[50],
              //Divider color
              dividerColor: Colors.grey,
              //Non selected days of the month color
              textTheme: TextTheme(
                bodyText2:
                    TextStyle(color: Colors.black),
              ),
              colorScheme: ColorScheme.fromSwatch().copyWith(
                //Selected dates background color
                primary: Colors.blue,
                //Month title and week days color
                onSurface: Colors.black,
                //Header elements and selected dates text color
                //onPrimary: Colors.white,
              ),
            ),
            child: child,
          );
        }
);

我创建了一个包 calendar_date_picker2 支持 high-level 自定义,只需将其包装在容器中并将容器颜色设置为背景颜色即可。