Отключаемый виджет не изменяется при использовании уникального ключа - PullRequest
0 голосов
/ 12 апреля 2020

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

StreamBuilder <QuerySnapshot>(
          stream: _firestore.collection('articles').snapshots(),
          builder: (BuildContext context, snapshot) {
            if (snapshot.hasError) {
              return Center(child: Text("Error fetching posts ${snapshot.error}"),);
            }
            if (snapshot.hasData) {
              List<DocumentSnapshot> documents = snapshot.data.documents;
              return GestureDetector(
                onHorizontalDragUpdate: (dragUpdateDetails) {
                  Navigator.push(context,
                      MaterialPageRoute(builder: (context) => WebViewContainer(documents[index].data['url'])));              },
                child: Dismissible(
                  key: Key(index.toString()),
                  direction: DismissDirection.vertical,
                  onDismissed: (direction) {
                    setState(() {
                      documents.removeAt(index);
                      index = (index==documents.length -1) ? index = 0 : index++;
                    });
                  },

Код работает нормально, пока я не достигну конца списка документов. Я получил следующее сообщение об ошибке:

════════ Exception caught by widgets library ═══════════════════════════════════════════════════════
The following assertion was thrown building Dismissible-[<'0'>](dirty, state: _DismissibleState#6b64c(tickers: tracking 2 tickers)):
A dismissed Dismissible widget is still part of the tree.


Make sure to implement the onDismissed handler and to immediately remove the Dismissible widget from the application once that handler has fired.

The relevant error-causing widget was: 
  Dismissible-[<'0'>] file:///C:/Users/Lenovo/AndroidStudioProjects/sevenlines/lib/widgets/newspage.dart:63:24
When the exception was thrown, this was the stack: 
#0      _DismissibleState.build.<anonymous closure> (package:flutter/src/widgets/dismissible.dart:526:11)
#1      _DismissibleState.build (package:flutter/src/widgets/dismissible.dart:535:8)
#2      StatefulElement.build (package:flutter/src/widgets/framework.dart:4334:27)
#3      ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4223:15)
#4      Element.rebuild (package:flutter/src/widgets/framework.dart:3947:5)
...
════════════════════════════════════════════════════════════════════════════════════════════════════

════════ Exception caught by widgets library ═══════════════════════════════════════════════════════
A dismissed Dismissible widget is still part of the tree.
The relevant error-causing widget was: 
  Dismissible-[<'0'>] file:///C:/Users/Lenovo/AndroidStudioProjects/sevenlines/lib/widgets/newspage.dart:63:24
════════════════════════════════════════════════════════════════════════════════════════════════════

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

1 Ответ

0 голосов
/ 12 апреля 2020

Попробуйте использовать ObjectKey, а не Введите key: Key(index.toString()), и укажите в качестве параметров данные вашего объекта.

...