【问题标题】:Initial date range not set on DateRangePickerDateRangePicker 上未设置初始日期范围
【发布时间】:2021-12-17 04:37:03
【问题描述】:

我正在开发需要使用共享首选项保留所选日期范围的应用程序。对于日期选择器,我使用external package,对于状态处理,我与提供者合作。

在提供者模型的开始,我从共享偏好中读取值:

class DateRangeFilterModel extends ChangeNotifier {
  PickerDateRange? _dateRange;

  DateRangeFilterModel() {
    loadDateRange();
  }

  PickerDateRange? get dateRange => _dateRange;

  Future<void> loadDateRange() async {
    _dateRange = await SharedPreferencesManager.getFilterDateRange();
    notifyListeners();
  }

  Future<PickerDateRange?> getDateRange() async {
    return await SharedPreferencesManager.getFilterDateRange();
  }

  Future<void> setDateRange(PickerDateRange? dateRange) async {
    _dateRange = dateRange;

    await SharedPreferencesManager.saveFilterDateRange(
        dateRange?.startDate, dateRange?.endDate);

    notifyListeners();
  }
}

使用Consumer 小部件,我尝试设置初始值,例如,我还在Text 小部件上显示结果。在Text 上显示小部件保存的日期范围,但在SfDateRangePicker 上没有。

Consumer<DateRangeFilterModel>(
    builder: (context, model, child) => Column(
      children: [
        Text(model.dateRange.toString()),
        SfDateRangePicker(
          initialSelectedRange: model.dateRange,
          showTodayButton: false,
          enablePastDates: false,
          selectionMode: DateRangePickerSelectionMode.range,
          minDate: DateTime.now(),
          onSelectionChanged: (DateRangePickerSelectionChangedArgs args) {
            if (args.value is PickerDateRange) {
              final DateTime? startDate = args.value.startDate;
              final DateTime? endDate = args.value.endDate;

              if (startDate != null && endDate != null) {
                context
                    .read<DateRangeFilterModel>()
                    .setDateRange(PickerDateRange(startDate, endDate));
              }
            }
          },
        ),
      ],
    ),
  ),

我的ChangeNotifierProvider

ChangeNotifierProvider(
      create: (context) => DateRangeFilterModel(),
      child: const DateRangePicker()
),

我认为存在一些并发问题。我在哪里犯错了? 感谢您的建议。

【问题讨论】:

    标签: flutter dart flutter-layout flutter-provider


    【解决方案1】:

    我的解决方案是通过controller 设置初始范围。

    final DateRangePickerController _controller = DateRangePickerController();
    .....
    SfDateRangePicker(
              initialSelectedRange: _controller.selectedRange = model.dateRange,
              controller: _controller,
             ...
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-13
      • 1970-01-01
      相关资源
      最近更新 更多