Flutter:如何防止不必要的快照快照触发

时间:2019-03-22 13:25:21

标签: flutter future

我正在研究一个显示SQFlite表中的列表的程序。快照列表的未来因我无法确定的原因而被解雇。射击次数大约是所需次数的3倍。它唯一需要触发的时间是(1)程序第一次激活,以及(2)从可创建,读取,更新和删除的更新屏幕返回时。因此,我在从该屏幕返回时设置了一个标志,以指示需要刷新快照。然后在选择数据的功能中,检查是否设置了标志,然后才选择表。

现在只需运行该程序以进行一些添加和删除,就可以选择以下快照:

“ I / flutter(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 :(得分:0)

经过一些研究,我相信这个问题的答案是从数据库或其他地方进行数据选择应与重建分开。在进行重建时,会将这些数据作为重建的一部分,但不会将其选择为重建的一部分。