Как ожидать значения для FutureBuilder, когда оно меняется с нуля в зависимости от значения, которое исходит из метода asyn c (пользовательский ввод) во флаттере? - PullRequest
0 голосов
/ 08 апреля 2020

Я создаю приложение расписания. (Я новичок)

У меня есть Card () с двумя полями, в котором есть asyn c метод выбора DateRange onPressed :() asyn c {...} . После ввода данных пользователем в List хранятся две переменные - в идеале начало недели и конец недели . После этого я проверяю, является ли это недельным интервалом, то есть только с понедельника по воскресенье. Если это так, я передаю эти значения в глобальные переменные в setState, чтобы эти поля в Card () обновлялись по выбору пользователя.

Исходя из этого диапазона, мне нужно будет собрать 7 карт (каждая карта на день недели). ). Для построения этих карт мне придется использовать FutureBuilder или есть лучшие решения ? Мне нужно передать ненулевые значения в Future of FutureBuilder, который я получаю от selected await DateRangePicker . Как мне выполнить sh это или есть лучшие / более простые решения?

import 'package:flutter/material.dart';
import 'package:datetime_picker_formfield/datetime_picker_formfield.dart';
import 'package:intl/intl.dart';
import 'package:date_range_picker/date_range_picker.dart' as DateRangePicker;

String formattedWeekStart;
String formattedWeekEnd;
DateTime datetimeStart;
DateTime datetimeEnd;
bool displayTimeCards = false;
List<HoursPerDayCard> listOfCards = [];

DateFormat dateFormat = DateFormat("MM-dd");

class PickWeekRange extends StatefulWidget {
  @override
  _PickWeekRangeState createState() => _PickWeekRangeState();
}

class _PickWeekRangeState extends State<PickWeekRange> {
  @override
  void initState() {
    super.initState();
    formattedWeekEnd = null;
    formattedWeekStart = null;
  }

  static DateTime pushStartToMonday(now) {
    var monday = 1;

    while (now.weekday != monday) {
      now = now.subtract(new Duration(days: 1));
    }
    return now;
  }
  DateTime mondayPicker = pushStartToMonday(DateTime.now());

  @override
  Widget build(BuildContext context) {
    return Card(
      elevation: 2,
      child: MaterialButton(
        disabledColor: Colors.white,
        shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)),
        child: Padding(
          padding: EdgeInsets.all(10),
          child: Column(
            children: <Widget>[
              Row(
                children: <Widget>[
                  DatePickerWeek(
                    title: 'Week beginning (Monday)',
                    weekValue:
                  ),
                ],
              ),
              SizedBox(
                height: 10,
              ),
              Row(
                children: <Widget>[
                  DatePickerWeek(
                    title: 'Week ending (Sunday)',
                    weekValue: formattedWeekEnd,
                  ),
                ],
              ),
            ],
          ),
        ),
        onPressed: () async {
          final List<DateTime> picked = await DateRangePicker.showDatePicker(
              context: context,
              initialFirstDate: mondayPicker /*DateTime.now()*/,
              initialLastDate: mondayPicker.add(new Duration(days: 6)),
              firstDate: DateTime(2015),
              lastDate: DateTime(DateTime.now().year + 2));

          if (picked != null && picked.length == 2) {
            if (picked[1].subtract(Duration(days: 6)) == picked[0] &&
                picked[0].weekday == 1) {
              displayTimeCards = true;

              setState(() {
                datetimeStart = picked[0];
                datetimeEnd = datetimeStart.add(Duration(days: 6));
                formattedWeekStart = dateFormat.format(picked[0]);
                formattedWeekEnd = dateFormat.format(picked[1]);
//                displayTimeCards = true;
              });
            } else {
              setState(() {
//                displayTimeCards = false;
              });
              showAlertDialog(context);
            }
          } // IF
        }, //async
        //onPressed
      ),
    );
  }
}

FutureBuilder. Как вернуть getFuture () с этими двумя значениями - начало и конец (когда они изменяются с нуля на диапазон понедельник-воскресенье) в buildTimeSheetList () ??? Таким образом, он строит мои карты для каждого дня недели после того, как пользователь вводит правильный диапазон недели.

для getFuture Я пытался имитировать диапазон с понедельника по воскресенье, как я делал это в воскресенье:)

Future<Widget> getFuture() {
  return buildTimeSheetList(datetimeStart, datetimeEnd);

//         Future.delayed(
//      Duration(seconds: 2),
//      () => buildTimeSheetList(DateTime.now().subtract(Duration(days: 2)),
//          DateTime.now().add(Duration(days: 4))));
}

StatefulWidget:
return Container(
      color: Colors.blueGrey,
      child: Container(
   child: ListView(children: <Widget>[

      PickWeekRange(),

      FutureBuilder(
                  future: getFuture(), 
                  builder: (BuildContext context, snapshot) {
                    return Container(
                      height: 800.0,
                      child: snapshot.hasData
                          ? Column(children: <Widget>[snapshot.data])
                          : Text('Select the week'),
                    );
                  },
                ),

   ]),
)
);

Вот как это должно выглядеть: первоначальный вид в ожидании действий пользователя

А после того, как пользователь выбрал «правильную» неделю, он должен взять карты для выбранная неделя: Финальная версия с FutureBuilder или лучшим решением

...