Я вызываю данные из firestore следующим образом:
getDoctorData() async {
DocumentSnapshot<Map<String, dynamic>> _snapshot = await FirebaseFirestore.instance.collection('doctors/1/1').doc('1').get();
return _snapshot.data()!;
}
Я вызываю функцию следующим образом:
final _query = getDoctorData();
Поскольку это будущее, я решил преобразовать его в простую карту:
var _data = {};
_query.then((value) => value.forEach((key, value) => _data[key] = value));
Но почему-то данные отображаются, если я проверяю переменную, однако, если я указываю ключ, он возвращает null
.
УПД
Весь код выглядит так:
import 'dart:developer';
import 'package:doc_app/api/get_data.dart';
import 'package:flutter/material.dart';
class DocPage extends StatelessWidget {
DocPage({Key? key}) : super(key: key);
final _query = getDoctorData();
@override
Widget build(BuildContext context) {
var _data = {};
_query.then((value) => value.forEach((key, value) => _data[key] = value));
inspect(_data);
inspect(_data['name']);
return SafeArea(
child: Container(
decoration: const BoxDecoration(
color: Color.fromARGB(255, 33, 124, 243),
),
child: Column(
///// lots of code below
Я новичок в дартс, поэтому много гуглил, но не нашел ответа на этот вопрос.
Спасибо!
Спасибо за ответ. Я обновил код.
Я рекомендую вам передать данные, которые вам нужно показать, в конструкторе DocPage, поскольку виджет без состояния предназначен только для отображения того, что вы передаете им в качестве параметра, выполняйте выборку того, что вне виджета они передают этот результат в качестве параметра Страница документа.
Поскольку вы добавляете значения в _data
в асинхронном обратном вызове then
, ваши inspect
вызовы выполняются до фактического заполнения _data
.
В некоторых средах проверка объекта отслеживается средой, а затем обновляется при изменении объекта (это началось в Chrome/WebKit, но в наши дни я вижу это и в других местах). Но когда вы регистрируете примитивное значение, этот вывод записывается только при выполнении кода и не обновляется позже.
Итак, я предполагаю, что вывод inspect(_data);
обновляется задним числом, когда он изменяется после выполнения оператора, в то время как inspect(_data['name']);
записывает значение только при выполнении оператора.
Я понял, спасибо за подробное объяснение.
Я ожидаю, что вы обращаетесь к
_data
, когда он еще не инициализирован. Можете ли вы показать, как код на вашем скриншоте связан с кодом, который вы включили в свой вопрос в виде текста?