Я работаю над программой, которая отображает список из таблицы 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()}");
}
}