【问题标题】:When I use Bloc pattern My infinite list doesn't scroll当我使用 Bloc 模式时,我的无限列表不会滚动
【发布时间】:2021-08-13 18:34:09
【问题描述】:

我想用 bloc 模式创建无限列表,但我的 bloc builder 只工作 1 次。滚动页面后“yield”不起作用,所以 bloc builder 不会构建。新项目来了,但状态没有建立.

deliveries_bloc.dart:

import 'dart:async';

import 'package:bloc/bloc.dart';
import 'package:equatable/equatable.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter_asten_app/data/orders_repository.dart';
import 'package:flutter_asten_app/models/order_list.dart';

import '../../locater.dart';

part 'deliveries_event.dart';
part 'deliveries_state.dart';

class DeliveriesBloc extends Bloc<DeliveriesEvent, DeliveriesState> {
  final OrdersRepository ordersRepository = getIt<OrdersRepository>();
  DeliveriesBloc() : super(DeliveriesInitial());
  List<OrderList> orderss = [];

  @override
  Stream<DeliveriesState> mapEventToState(
    DeliveriesEvent event,
  ) async* {
    if (event is FetchDeliveriesEvent) {
      yield DeliveriesLoadingState();
      try {
        final orders = await ordersRepository.getOrderList(event.page);
        print(orders.length);
        yield DeliveriesLoadedState(orders: orders);
      } catch (_) {
        yield DeliveriesErrorState();
      }
    } else if (event is FetchMoreDeliveriesEvent) {
      try {
        final orders = await ordersRepository.getMoreOrderList(event.page);
        print(orders.length);                  //this is for check the orders length
        yield DeliveriesLoadedState(orders: orders);
      } catch (_) {
        yield DeliveriesErrorState();
      }
    }
  }
}


您可以在上面看到当我的事件是 FetchMoreDeliveriesEvent 我的订单长度增加但产量 DeliveriesLoadedState(orders: orders);不工作 Deliveries_state.dart:

part of 'deliveries_bloc.dart';

abstract class DeliveriesState extends Equatable {
  const DeliveriesState();
}

class DeliveriesInitial extends DeliveriesState {
  @override
  List<Object> get props => [];
}

class DeliveriesLoadingState extends DeliveriesState {
  @override
  // TODO: implement props
  List<Object> get props => throw UnimplementedError();
}

class DeliveriesLoadedState extends DeliveriesState {
  final List<OrderList> orders;

  DeliveriesLoadedState({@required this.orders});
  @override
  // TODO: implement props
  List<Object> get props => [orders];
}

class DeliveriesErrorState extends DeliveriesState {
  @override
  // TODO: implement props
  List<Object> get props => throw UnimplementedError();
}

deliveries_event.dart:

part of 'deliveries_bloc.dart';

abstract class DeliveriesEvent extends Equatable {
  const DeliveriesEvent();
}

class FetchDeliveriesEvent extends DeliveriesEvent {
  final int page;
  FetchDeliveriesEvent({@required this.page});
  @override
  // TODO: implement props
  List<Object> get props => [page];
}

class FetchMoreDeliveriesEvent extends DeliveriesEvent {
  final int page;
  FetchMoreDeliveriesEvent({@required this.page});
  @override
  // TODO: implement props
  List<Object> get props => [page];
}

Main_page部分

Expanded(
                      child: BlocBuilder<DeliveriesBloc, DeliveriesState>(
                        bloc: _ordersBloc,
                        builder: (context, DeliveriesState state) {
                          if (state is DeliveriesLoadingState) {
                            return Center(
                              child: CircularProgressIndicator(),
                            );
                          }
                          if (state is DeliveriesLoadedState) {
                            return ListView.builder(
                                controller: _scrollController,
                                itemCount: state.orders.length,
                                itemBuilder: (context, index) {
                                  return Card(
                                    elevation: 4,
                                    child: ListTile(
                                      title: Text(state.orders[index].firadi),
                                      subtitle: Text(state.orders[index].sidttr
                                          .toString()),
                                    ),
                                  );
                                });
                          } else {
                            return null;
                          }
                        },
                      ),
                    ),

【问题讨论】:

标签: flutter flutter-bloc


【解决方案1】:

只有在其内容发生变化时,Bloc builder 才会重新构建小部件。确保您将可检测的变量提供给您的 equatable 的 props getter。

如果您的 OrderList 类不是从 Equatable 扩展的,则订单字段的更改不会反映在状态中。

检查您是否使用Equatable 扩展了您的OrderList 类,如果是,请确保您也添加了它的道具。

【讨论】:

  • 首先感谢您的帮助,“订单”数组的大小正在发生变化。这种变化还不足以让集团看到变化吗?
  • 如果是这样的话,那应该足够了,但也要确保这一点,因为您不应该面对其他业务逻辑的任何问题,例如将来更改项目的内容。换个方向,尝试在 ListView 构建器函数中为您的 listTile 或 Card 添加一个唯一键
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-10
  • 2012-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多