Как я могу сделать предварительную загрузку информации о ящике из базы данных Firebase во флаттере? - PullRequest
0 голосов
/ 17 марта 2020

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

class MainDrawer extends StatefulWidget {
  @override
  _MainDrawerState createState() => _MainDrawerState();
}

class _MainDrawerState extends State<MainDrawer> {
  UserCore user = UserCore();
  Future getUser() async {
    var uid = await FirebaseAuth.instance.currentUser().then((val) {
      return val.uid;
    });

    Firestore.instance
        .collection("users")
        .where("uid", isEqualTo: uid)
        .getDocuments()
        .then((val) {
      user = UserCore.fromMap(val.documents[0]);
      setState(() {});
    });
  }

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

  @override
  Widget build(BuildContext context) {
    return Drawer(
      child: Container(
        alignment: Alignment.centerLeft,
        color: Color.fromRGBO(59, 46, 46, 1),
        child: ListView(
          shrinkWrap: true,
          scrollDirection: Axis.vertical,
          //padding: EdgeInsets.zero,
          children: <Widget>[
            Column(
              children: <Widget>[
                DrawerHeader(
                  child: Image.asset(
                    "img/logo.png",
                    width: 100,
                  ),
                ),
                drawerInfo("User: ", user.info1 == "" ? user.info2: user.info1),
                drawerInfo("Email: ", user.email),
              ],
            ),

Это основная часть кода, и мой последний вопрос: как я могу сделать так, чтобы данные, поступающие из базы данных Firebase, перестали внезапно появляться в ящике и быть там, когда пользователь это открывает? Этот ящик присутствует в большинстве приложений, поэтому передача информации в качестве параметра практически невозможна.

1 Ответ

0 голосов
/ 17 марта 2020

Вы загружаете данные из Firebase, что означает, что они могут приходить из сети, и это неизбежно займет время. Есть много способов сделать это (кажется) быстрее для пользователя:

  1. Используйте более быстрое сетевое соединение или подойдите ближе к серверу. Хотя я знаю, что они часто не реализуются c, важно установить правильное ожидание: большую часть времени, в течение которого ваш пользователь ожидает, имеет три фактора:

    1. Их расстояние до серверов, которые содержат данные, обычно переводимые в задержку: время, необходимое для отправки пакета данных на сервер и получения ответа.
    2. Доступная пропускная способность их соединения, так как она определяет, с какой скоростью можно отправлять данные / к их устройству.
    3. Объем данных, запрашиваемый вашим кодом, поскольку отправка / получение большего количества данных займет больше времени.

    Поскольку первые две опции вряд ли под вашим контролем Единственный из них, который вы можете контролировать, - это объем запрашиваемых вами данных. Обязательно запрашивайте только те данные, которые вам абсолютно необходимы для отображения. Кажется, вы уже делаете это, но - это, как правило, , что-то, что нужно учитывать.

  2. Кэшируйте данные локально и перезагружайте их оттуда. Firestore автоматически сохраняет все полученные данные в кеше диска на локальном устройстве и может загрузить их оттуда, когда приложение запросит их снова. Но то, как вы сейчас загружаете пользовательский документ, обходит этот кеш и заставляет запрос отвечать с сервера.

    Есть два способа это исправить:

    1. Заставьте getDocuments() вызвать из кеша, передав Source: Source.serverAndCache в него. Если вы получили результат, покажите его пользователю. Если вы не получите результат, вам все равно придется запросить его с сервера.

    2. Используйте прослушиватель в реальном времени , который сначала возвращает документ ( s) из кэша, затем проверяет наличие обновлений на сервере и повторно вызывает ваш код с любыми обновлениями. Это означает, что пользователь сразу видит локально кэшированную версию, а затем может увидеть обновление через несколько секунд.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...