Флаттер: как я могу предотвратить ненужное срабатывание Future for snapshot - PullRequest
0 голосов
/ 22 марта 2019

Я работаю над программой, которая отображает список из таблицы SQFlite. Будущее для списка снимков снимается без причины, которую я могу определить. Он срабатывает примерно в 3 раза больше, чем нужно. Единственное время, которое нужно запустить - это (1) первый раз, когда программа активируется, и (2) когда она возвращается с экрана обновления, который может создавать, читать, обновлять и удалять. Следовательно, по возвращении с этого экрана я установил флажок, чтобы указать, что снимок необходимо обновить. Затем в функции, которая выбирает данные, я проверяю, установлен ли флаг, и только тогда я выбираю таблицу.

Просто запуск программы сейчас для некоторых добавлений и удалений привел к следующему для выбора для снимка:

"I / флаттер (24769): извлечено = ложно, попытки извлечения = 20, извлечено = 7"

Это указывает на то, что было необходимо только 7 отборов, но было запрошено 20.

Может кто-нибудь посоветовать мне правильный способ предотвращения стрельбы в будущем, когда в этом нет необходимости? Соответствующий код ниже:

     body: Container(
            padding: EdgeInsets.all(16.0),
            child: FutureBuilder<List<Map>>(
                future: _fetchDataFromDb(),
                builder: (context, AsyncSnapshot<List<Map>> snapshot) {
                    if (snapshot.connectionState == ConnectionState.done) {
                      if (!snapshot.hasError && snapshot.hasData) {
                        return ListView.builder(
                          itemCount:  snapshot == null ? 0 : snapshot.data.length,
                          itemBuilder: (context, index) {
                            return Column(
                                crossAxisAlignment: CrossAxisAlignment.start,
                                children: <Widget>[
                                  ListTile(
                                      leading: (IconButton /* Edit */ (
                                          color: Colors.blue,
                                          icon: Icon(Icons.edit),
                                          onPressed: () => _showEditScreen(
                                              Crud.eUpdate,
                                              snapshot.data[index]))),
                                      title:
                                          Text(snapshot.data[index]['title']),
                                      subtitle:
                                          Text(snapshot.data[index]['detail']),
                                      onLongPress: () => _showEditScreen(
                                          Crud.eRead, snapshot.data[index]),
                                      trailing: (IconButton(
                                          color: Colors.red,
                                          icon: Icon(Icons.delete),
                                          onPressed: () => _showEditScreen(
                                              Crud.eDelete,
                                              snapshot.data[index])))),
                                ]);
                          });
                    }
                  }
                })),
  Future<List<Map>> _fetchDataFromDb() async {
    bool tfFetched = false;
    _iFetchAttempts++;
    if (_tfGetData) {
      print("Fetching data");
      _snapshot = await _dbHelper.getNoteRecs();
      tfFetched = true;
      _tfGetData = false;
      _iFetched++;
      setState(() => _iCount = _snapshot.length);
    }
    print(
        "Fetched = $tfFetched, Fetch attempts = $_iFetchAttempts, Fetched = $_iFetched");
    return _snapshot;
  }

  void _showEditScreen(Crud eCrud, data) async {
    try {
      NoteRec noteRec = data == null
          ? null
          : NoteRec(data['id'], data['title'], data['detail']);
      await Navigator.push(
          context,
          MaterialPageRoute(
              builder: (BuildContext context) =>
                  NoteEntry(g_crud: eCrud, g_noteRec: noteRec)));
      _tfGetData = true;   // SET FLAG TO INDICATE SELECT IS REQUIRED
    } catch (error) {
      print("Error on navigation = ${error.toString()}");
    }
  }

1 Ответ

0 голосов
/ 19 апреля 2019

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

...