Создание ListView Builder из StreamBuilder с базой данных ISAR

Я пытаюсь создать ListViewBuilder из Stream Builder во Flutter.

Класс TodoList

      import 'package:isar/isar.dart';

part 'todo_list.g.dart';

@Collection()
class TodoList {
  Id id = Isar.autoIncrement;
  late String todoTitle;
}

Изар Услуги

       class IsarService {
  late Future<Isar> db;
  IsarService() {
    db = openDB();
  }
  //Return IsarDB, if not found, then create
  Future<Isar> openDB() async {
    if (Isar.instanceNames.isEmpty) {
      return await Isar.open(
        [TodoListSchema],
        inspector: true,
      );
    }
    return Future.value(Isar.getInstance());
  }
  Stream<List<TodoList>> listenToTodoList() async* {
    final isar = await db;
    yield* isar.todoLists.where().watch(fireImmediately: true);
  }
}

ListViewBuilder сверху Streambuilder

      class ListScreen extends StatefulWidget {
  final IsarService service;
  const ListScreen(this.service, {super.key});

  @override
  State<ListScreen> createState() => _ListScreenState();
}

class _ListScreenState extends State<ListScreen> {
  //Text Controller
  final _textController = TextEditingController();
  final service = IsarService();
  //Let's build List Title from snapshot
  final List<TodoList> _todoList = [];

//Root widget of the class
  @override
  Widget build(BuildContext context) {
    return Scaffold(
     
      //List Screen Body Section
      body: StreamBuilder(
        stream: service.listenToTodoList(),
        builder: (context, snapshot) {
          if (snapshot.hasError) {
            AlertDialog(
              content: Text(snapshot.error.toString()),
            );
          } else if (snapshot.hasData) {
            _todoList.add(snapshot.data); //Error happen in this line
          }

          return const CircularProgressIndicator();
        },
      ),
    );
  }
}

Ошибка

Тип аргумента «Список?» не может быть присвоен типу параметра «TodoList».

Я пытаюсь назначить данные снимка вfinal List<TodoList> _todoList = [];и используйте их ListViewBuilder

1 ответ

Попробуйте этот код:

      return Scaffold(
  body: StreamBuilder(
  stream: service.listenToTodoList(),
  builder: (context, snapshot) {
    if (snapshot.hasError) {
      AlertDialog(
        content: Text(snapshot.error.toString()),
      );
    } else if (snapshot.hasData) {
      final todos = snapshot.data;
      if (todos != null) {
        return ListView.builder(
          itemCount: todos.length();
          itemBuilder: (context, index) {
            final todo = todos[index];
            return Text(todo.todoTitle);
          }
        );
      } else {
        return const Center(child: Text('No data found!'));
      }
    }
    return const CircularProgressIndicator();
    },
  ),
);
Другие вопросы по тегам