Как получить данные из пожарного магазина один раз и использовать их даже после перехода на другой экран? - PullRequest
1 голос
/ 05 апреля 2020

Я хочу получить данные из магазина и использовать их для создания карт во Flutter, используя ListView на домашней странице. Используя меню навигации для переключения между экранами, я намерен повторно использовать данные, полученные после сеанса, а не извлекать их из базы данных каждый раз, когда возвращаюсь на домашнюю страницу. Но этого не происходит; Данные извлекаются из базы данных каждый раз, когда я go перехожу на домашнюю страницу.

        FutureBuilder(
          future: databaseService(),
          builder: (context, snapshot) {
            if (snapshot.hasData) {
              stringMap = snapshot.data;
            }
            return ListView.builder(
              itemBuilder: (context, index) {
                stringMap.forEach((index, value) => {
                      print("The stringMap is ${stringMap.keys.toList()}"),
                    });
                return HomepageCards(
                  user: widget.user,
                  cardDetails: stringMap[stringMap.keys.toList()[index]],
                );
              },
              itemCount: stringMap.length,
              scrollDirection: Axis.vertical,
              controller: _controller,
              shrinkWrap: true,
            );
          },
        )


  databaseService() async {
    return DatabaseService().streamHomePage(widget.user);
  }

DatabaseService.dart

class DatabaseService {
  final Firestore _db = Firestore.instance;
  HomePage home = new HomePage();
  Map homePageMap = new Map<String, Map<String, dynamic>>();

  /// Query a subcollection
  Future streamHomePage(FirebaseUser user) async {
//   Initialise the model map
    home.homeModel = <String, dynamic>{};
    home.homeModel['driverDetails'] = new Map();

    var ref = _db
        .collection('homepage')
        .document(user.uid)
        .collection('h')
        .document('28032020');
// TODO: Try to use cached data. Also try to find the pattern for switching between server and cache
    await ref.get(source: Source.serverAndCache).then((ref) => {
          ref.data.forEach((index, value) => {
                home.homeModel = value,
                homePageMap[index] = value,
              }),
        });
    return homePageMap;
  }
}

Любые выводы, приводящие к повторному использованию данных после многократного использования, будут весьма оценили.

1 Ответ

1 голос
/ 05 апреля 2020

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

  SharedPreferences prefs = await SharedPreferences.getInstance();

  databaseService() async {
     await prefs.setBool('retrieved', true);
    return DatabaseService().streamHomePage(widget.user);
  }

Затем перед выполнением проверки FutureBuilder, равняется ли извлечено истинному, используя getBool(), и извлекайте данные из сессия

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