Как передать данные из функции в другой класс во флаттере - PullRequest
0 голосов
/ 04 ноября 2019

Как новичок в Flutter, я пытаюсь создать приложение для календаря, в котором я хочу получать данные за определенный день из базы данных Firestore. Прямо сейчас есть функция _onDaySelected, которая печатает выбранный день из календаря в консоли флаттера, как это «флаттер: 2019-11-04». Я бы хотел, чтобы эта строка передавалась в класс MessagesStream, чтобы я мог вызывать .document ('$ currentDay') вместо жесткого кодирования дня, подобного следующему: .document ('2019-11-04'). Я включил код ниже.

Кто-нибудь знает, как это сделать? Любая помощь будет оценена!

class RoosterTest extends StatefulWidget {

  @override
  _RoosterTestState createState() => _RoosterTestState();
}

class _RoosterTestState extends State<RoosterTest>
    with TickerProviderStateMixin {
  Map<DateTime, List> _events;
  List _selectedEvents;
  AnimationController _animationController;
  CalendarController _calendarController;
  final messageTextController = TextEditingController();

  String messageText;

  static final now = DateTime.now();
  static final formatter = DateFormat('yyyy-MM-dd');
  static final formatted = formatter.format(now);

  @override
  void initState() {
    super.initState();

    final _selectedDay = DateTime.now();
    _events = {};

    _selectedEvents = _events[_selectedDay] ?? [];

    _calendarController = CalendarController();

    _animationController = AnimationController(
      vsync: this,
      duration: const Duration(milliseconds: 400),
    );

    _animationController.forward();
  }

  @override
  void dispose() {
    _animationController.dispose();
    _calendarController.dispose();
    super.dispose();
  }

  void _onDaySelected(DateTime day, List events) {
    String currentDay = formatter.format(day).toString();
    print('$currentDay');
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        mainAxisSize: MainAxisSize.max,
        children: <Widget>[
          _buildTableCalendar(),
          const SizedBox(
            height: 8.0,
          ),
          MessagesStream(),
        ],
      ),
    );
  }

Widget _buildTableCalendar() {
    return TableCalendar(
      calendarController: _calendarController,
      events: _events,
      startingDayOfWeek: StartingDayOfWeek.monday,
      calendarStyle: CalendarStyle(
        selectedColor: Colors.red,
        todayColor: Colors.blue,
        markersColor: Colors.green,
        outsideDaysVisible: false,
        weekendStyle: TextStyle().copyWith(color: Colors.red),
      ),
      headerStyle: HeaderStyle(
        formatButtonTextStyle:
            TextStyle().copyWith(color: Colors.white, fontSize: 15.0),
        formatButtonDecoration: BoxDecoration(
          color: Colors.red,
          borderRadius: BorderRadius.circular(16.0),
        ),
      ),
      onDaySelected: _onDaySelected,
      onVisibleDaysChanged: _onVisibleDaysChanged,
    );
  }

class MessagesStream extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return StreamBuilder<QuerySnapshot>(
      stream: _firestore
          .collection('days')
          .document('2019-11-04')
          .collection('hours')
          .snapshots(),
      builder: (context, snapshot) {
        if (!snapshot.hasData)
          return CircularProgressIndicator(
            backgroundColor: Colors.lightBlueAccent,
          );

        return _buildList(context, snapshot.data.documents);
      },
    );
  }

1 Ответ

1 голос
/ 04 ноября 2019

Вы можете сохранить результат метода _onDaySelected в переменной вашего класса состояний:

class _RoosterTestState extends State<RoosterTest>
    with TickerProviderStateMixin {
    String stringOfSelectedDay='defaultValue';
[...]

Не забудьте при первом запуске приложения предоставить stringOfSelectedDay сзначение по умолчанию. Что должен вернуть ваш MessagesStream, когда _onDaySelected еще не было вызвано? Может быть, сегодняшняя дата?

Итак, в методе вы можете сохранить его следующим образом:

void _onDaySelected(DateTime day, List events) {
    String currentDay = formatter.format(day).toString();
    setState(() { 
        stringOfSelectedDay = currentDay; 
    });
    print('$currentDay');
  }

Вы должны использовать setState, чтобы перестроить MessagesStream после того, как день изменился.

После этого вы должны сделать, чтобы ваш класс MessagesStream имел окончательную переменную, чтобы он строил поток на его основе, и конструктор, который дает ему его значение:

class MessagesStream extends StatelessWidget {
  final String date;
  MessagesStream(this.date); //Constructor
  @override
  Widget build(BuildContext context) {
    return StreamBuilder<QuerySnapshot>(
      stream: _firestore
          .collection('days')
          .document(date) // Using the final variable here
          .collection('hours')
          .snapshots(),
      builder: (context, snapshot) {
        if (!snapshot.hasData)
          return CircularProgressIndicator(
            backgroundColor: Colors.lightBlueAccent,
          );

        return _buildList(context, snapshot.data.documents);
      },
    );
  }

Поскольку вы использовали setState, этоВиджет будет отражать различные вызовы метода _onDaySelected.

Наконец, когда вы вызываете свой Виджет для создания, передайте переменную соответственно:

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        mainAxisSize: MainAxisSize.max,
        children: <Widget>[
          _buildTableCalendar(),
          const SizedBox(
            height: 8.0,
          ),
          MessagesStream(stringOfSelectedDay), //Using the new constructor you've made.
        ],
      ),
    );
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...