【问题标题】:I can't figure out why the list isn't loading我不知道为什么列表没有加载
【发布时间】:2022-01-13 18:55:17
【问题描述】:

我不明白为什么当我进入应用程序时 TodoList 没有立即加载。我得到的不是列表,而是 TodoEmptyState 状态,即使我已经在数据库中保存了项目,起初它仍然是一个空列表。但在那之后,当我添加一个新元素并更新它时,它就会加载。 但是我希望在不点击按钮的情况下进入应用程序时立即加载列表(如果有保存的项目)。 请告诉我该怎么做?

home_screen

Widget build(BuildContext context) {
    return BlocBuilder<TodoBloc, TodoState>(builder: (context, state) {
      return Scaffold(
        appBar: AppBar(
          title: const Text('Flutter Todos'),
        ),
        body: SingleChildScrollView(
          child: Column(
            children: [
              TodoList(),
            ],
          ),
        ),

待办事项列表

class TodoList extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final TodoBloc todoBloc = context.read<TodoBloc>();
    return BlocBuilder<TodoBloc, TodoState>(builder: (context, state) {
      if (state is TodoEmptyState) {
        return const Center(
          child: Text(
            'No Todo',
            style: TextStyle(fontSize: 20.0),
          ),
        );
      }

      if (state is TodoLoadingState) {
        return const Center(child: CircularProgressIndicator());
      }

      if (state is TodoLoadedState) {
        return ListView.builder(
            physics: const NeverScrollableScrollPhysics(),
            shrinkWrap: true,
            itemCount: state.loadedUser.length,
            itemBuilder: (context, index) =>
                // return _buildListTile(state.loadedUser[index]);
                ListTile(
                  title: Column(children: [
                    Text('${state.loadedUser[index].description}'),
                    Text('${state.loadedUser[index].id}'),
                  ]),
                  trailing: IconButton(
                    onPressed: () {
                      todoBloc.add(DeleteTodos(id: state.loadedUser[index].id));
                      todoBloc.add(LoadTodos());
                    },
                    icon: const Icon(Icons.delete),
                  ),
                ));
      }
      return const SizedBox.shrink();
    });
  }
}

todo_bloc

class TodoBloc extends Bloc<TodoEvent, TodoState> {
  final TodoRepository todoRepository;

  TodoBloc(this.todoRepository) : super(TodoEmptyState()) {
    on<LoadTodos>((event, emit) async {
      emit(TodoLoadingState());
      try {
        final List<Todo> _loadedTodoList = await todoRepository.getAllTodos();
        emit(TodoLoadedState(loadedUser: _loadedTodoList));
      } catch (_) {
        emit(TodoErrorState());
      }
    });

这是进入应用程序时的屏幕,但我已经在数据库中有数据,但它们没有立即显示。为什么?

【问题讨论】:

    标签: flutter dart flutter-layout


    【解决方案1】:

    现在,您将任何事件添加到您的集团的唯一位置是在 IconButtononPressed 内,这就是为什么您的集团状态保持在其初始状态 TodoEmptyState 并且在 IconButton 之前不会改变按下。您可以将您的TodoList 转换为StatefulWidget 并将LoadTodos 事件添加到initState 中的集团:

    class TodoList extends StatefulWidget {
      @override
      State<TodoList> createState() => _TodoListState();
    }
    
    class _TodoListState extends State<TodoList> {
      @override
      void initState() {
        super.initState();
        todoBloc.add(LoadTodos());
      }
    
      @override
      void dispose() {
        todoBloc.close();
        super.dispose();
      }
    
      @override
      Widget build(BuildContext context) {
        final TodoBloc todoBloc = context.read<TodoBloc>();
        return BlocBuilder<TodoBloc, TodoState>(builder: (context, state) {
          if (state is TodoEmptyState) {
            return const Center(
              child: Text(
                'No Todo',
                style: TextStyle(fontSize: 20.0),
              ),
            );
          }
    
          if (state is TodoLoadingState) {
            return const Center(child: CircularProgressIndicator());
          }
    
          if (state is TodoLoadedState) {
            return ListView.builder(
                physics: const NeverScrollableScrollPhysics(),
                shrinkWrap: true,
                itemCount: state.loadedUser.length,
                itemBuilder: (context, index) =>
                // return _buildListTile(state.loadedUser[index]);
                ListTile(
                  title: Column(children: [
                    Text('${state.loadedUser[index].description}'),
                    Text('${state.loadedUser[index].id}'),
                  ]),
                  trailing: IconButton(
                    onPressed: () {
                      todoBloc.add(DeleteTodos(id: state.loadedUser[index].id));
                      todoBloc.add(LoadTodos());
                    },
                    icon: const Icon(Icons.delete),
                  ),
                ));
          }
          return const SizedBox.shrink();
        });
      }
    }
    

    【讨论】:

    • 非常感谢。这个选项有帮助!
    猜你喜欢
    • 2016-02-01
    • 1970-01-01
    • 2022-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-28
    • 2016-05-22
    • 2017-04-01
    相关资源
    最近更新 更多