Как вернуть данные (2 списка) из класса в StatefulWidget, который его вызвал

#flutter

#flutter

Вопрос:

Проблема: я не могу понять, как вернуть данные (2 списка) из класса (GraphData) в виджет с отслеживанием состояния (экран цены), который вызвал класс (GraphData).

Предыстория: экран цены (StatefulWidget) вызывает класс GraphData и его функцию getGraphData() с помощью getData():

price_screen.dart

 getData() async {
        isWaiting = true;
        try {
          await GraphData().getGraphData(
              selectedCurrency: selectedCurrency,
              selectedGraphType: selectedGraphType);
        } catch (e) {
          print(e);
        }
      }
  

Затем GraphData выполняет некоторые вычисления и создает два списка: closingTimes и closingPrices.

graph_data.dart

 class GraphData {
  Future getGraphData(
      {String selectedCurrency,
      String selectedGraphType}) async {
    List<String> closingTimes = [];
    List<double> closingPrices = [];
    .
    . (some calculations here)
    .

        closingTimes.add(formattedClosingTime);
        closingPrices.add(closePrice);

      
      }
    } 
  }
}
  

Мне нужно вернуть эти два списка обратно в PriceScreen (StatefulWidget), чтобы я мог использовать их в более поздней функции. Как я могу это сделать?

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

Комментарии:

1. возврат отсутствует

2. Да, я знаю, что мой старый код вернул что-то в конце, но я меняю свой код, чтобы вместо этого возвращать 2 списка. В настоящее время я не знаю, как это сделать, поэтому я пропустил ключевое слово return здесь.

Ответ №1:

Вы можете либо вернуть Map<String, List<dynamic>> :

 return <String, List<dynamic>>{
  'closingTimes': closingTimes,
  'closingPrices': closingPrices
};
  

или вы могли бы написать новый класс:

 class GraphDataReturnObject {
  final List<String> closingTimes;
  final List<double> closingPrices;

  const GraphDataReturnObject(this.closingTimes, this.closingPrices);
}
  

и

 return GraphDataReturnObject(closingTimes, closingPrices);
  

и

 GraphDataReturnObject graphData = await GraphData().getGraphData(...);

// you can access the closing times and closing prices like this:
graphData.closingTimes;
graphData.closingPrices;
  

Комментарии:

1. Должен ли я создать этот новый класс GraphDataReturnObject в моем уже написанном классе GraphData или в совершенно новом отдельном классе?

2. Поправьте меня, если я ошибаюсь, но я думаю, что Dart не позволяет создавать внутренние классы.

3. О, я не уверен, так как я все еще новичок в Dart. Итак, если бы я должен был создать отдельный класс GraphDataReturnObject, буду ли я ссылаться на этот класс в своем классе GraphData, чтобы передать ему значения списка closingTimes и closingPrices, а затем снова ссылаться на него в моем PriceScreen, чтобы получить значения обратно?