Может ли ошибка «Невозможно использовать локальную переменную до ее объявления» разрешить с помощью асинхронных функций?

У меня есть приложение, которое добавляет виджет Card, когда пользователь нажимает FAB. Существует список типа Card, который отображается в SliverGrid, в котором хранится Card, добавленный пользователем. Я хотел реализовать функцию удаления, но когда я попытался это сделать, я получаю сообщение об ошибке «Невозможно использовать локальную переменную до ее объявления». Card добавляется в список с помощью этого кода:

  int _count = 0;

cardList = List.generate(_count, (int i) =>
    new Card(
      child: ListTile(
        title: Text("project 1"),
        trailing: new Listener(
            key: new Key(UniqueKey().toString()),
            child: new Icon(Icons.remove_circle,
              color: Colors.redAccent,),
            onPointerDown: (pointerEvent) {}
//                deleteNoDo(), //this is the delete function
        ),
      ),
    )
    );

Card генерируется с использованием этого кода (эта кнопка определена под Scaffold):

 floatingActionButton: FloatingActionButton(
 onPressed: () async {
 setState(() {
           _count += 1;
     });
 },
heroTag: "btn2",
child: Icon(Icons.add, color: Color(whitecolor),), // this is just a custom color
backgroundColor: Color(redcolor),), // this is just a custom color

это функция удаления:

     deleteNoDo(int index) {
        debugPrint("Deleted Item!");
        setState(() {
          cardList.removeAt(index);
        });
      }

это SliverGrid, где отображается cardList:

   SliverGrid(
       gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
       crossAxisCount: 2
                      ),
                      delegate: new SliverChildBuilderDelegate((context,index) {
             return cardList[index]; // this is where the cards are displayed in a list
            },
             childCount: cardList.length
       )
    ),

вопрос: можно ли устранить ошибку «Невозможно использовать локальную переменную до ее объявления», если я использую базу данных, поскольку функции базы данных (CRUD) асинхронны?


person Community    schedule 16.09.2019    source источник


Ответы (1)


Проблема в том, что ваша переменная cardList является локальной, и вы пытаетесь получить к ней доступ внутри асинхронного обратного вызова, у которого нет области для доступа к ней. Объявите cardList внутри initState и инициализируйте его пустым списком и внутри сборки или где бы вы ни хотели присвоить этой переменной фактические значения, а затем после действия кнопки удаления вы можете получить к ней доступ.

person Kushagra Saxena    schedule 16.09.2019