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

Я пытаюсь создать ListView Builder из 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);
  }
}

ListView Builder сверху 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 = []; и использовать их ListView Builder

не могли бы вы поделиться своим TodoList классом? В основном элемент списка должен быть типа TodoList, и вы должны преобразовать snapshot.data (типа Map<String,dynamic>) в TodoList

Delwinn 25.01.2023 07:18

Пожалуйста, поделитесь своим IsarService классом

its-me-mahmud 25.01.2023 08:04
snapshot.data вернуть данные из Stream данных. Но вы пытаетесь добавить эти возвращенные данные через _todoList.add(snapshot.data) и поэтому выдает ошибку
its-me-mahmud 25.01.2023 08:59

@Delwinn, я отредактировал свой вопрос. Пожалуйста, посмотрите.

abdullah_bd 25.01.2023 09:33
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
72
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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();
    },
  ),
);

Другие вопросы по теме

Изменение размера ListView во время прокрутки во Flutter
Получение RangeError (индекс): Недопустимое значение: Допустимый диапазон значений пуст: 0
Как можно использовать будущее в флаттере списка?
Горизонтальный ListView.Builder() не работает во Flutter
Flutter ListView становится неаккуратным и медленным при использовании кнопок RadioListTile или Radio в каждом элементе
Не удалось обновить список с установленным состоянием в текстовом поле по измененному методу
Flutter: RangeError (index): недопустимое значение: не входит в инклюзивный диапазон 0..3: 4 с использованием IndexedListView.builder
Ошибка: тело может завершиться нормально, в результате чего будет возвращено значение «null», но тип возвращаемого значения «Widget» потенциально не может принимать значения NULL
Использование ListView с асинхронными элементами без предварительного знания itemCount
Как загрузить все сообщения из базы данных firebase во Flutter?