簡體   English   中英

顫動:如何防止Future快照不必要地發射

[英]Flutter: How can I prevent Future for snapshot from firing unnecessarily

我正在開發一個顯示SQFlite表中列表的程序。 我無法確定快照列表的未來。 它發射的火焰大約是所需的3倍。 它需要觸發的唯一時間是(1)程序第一次激活,以及(2)何時從可以創建,讀取,更新和刪除的更新屏幕返回。 因此,我從該屏幕返回時設置一個標志,表示需要刷新快照。 然后在選擇數據的函數中,檢查是否設置了標志,然后才選擇表。

現在只需運行程序進行一些添加和刪除,就可以選擇快照:

“I / flutter(24769):Fetched = false,Fetch attempts = 20,Fetched = 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()}");
    }
  }

經過一些研究,我認為這個問題的答案是從數據庫或其他地方選擇數據應該與重建分開。 重建將作為重建的一部分提供此數據,但不會將其作為重建的一部分進行選擇。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM