无法在 Flutter BlocConsumer 中获取正确的返回类型

Can't get the right return type in Flutter BlocConsumer

提问人:Dusko 提问时间:10/26/2023 更新时间:10/28/2023 访问量:30

问:

我无法访问 bloc consumer 中的状态

这是用于管理错误的存储库实现类

class UserRepositoryImplementation implements UserRepository {
  const UserRepositoryImplementation(this._remoteDataSource);

  final UserRemoteDatasource _remoteDataSource;

  @override
  ResultFuture<List<UserListModel>> fetchAllUsers() async {

    try {
      final result = await _remoteDataSource.fetchAllUsers();
    
      return Right(result);
    } on ServerException catch (e) {
      return Left(ServerFailure(message: e.message, statusCode: e.statusCode));
    }
  }
}

这是一个用于管理远程数据请求的类

abstract class UserRemoteDatasource {
  const UserRemoteDatasource();

  Future<List<UserListModel>> fetchAllUsers();
}

const baseUrl = 'http://192.168.31.163:8000/api/';

class UserRemoteDatasourceImplementation implements UserRemoteDatasource {
  const UserRemoteDatasourceImplementation(
    this.client,
  );

  final http.Client client;

  Uri getUrl({
    required String url,
    Map<String, String>? extraParameters,
  }) {
    final queryParameters = <String, String>{'key': ''};
    if (extraParameters != null) {
      queryParameters.addAll(extraParameters);
    }

    return Uri.parse('$baseUrl/$url').replace(
      queryParameters: queryParameters,
    );
  }

  _header(token) => {
        'Content-type': 'application/json',
        'Charset': 'utf-8',
        'Authorization': 'Bearer $token',
      };

  @override
  Future<List<UserListModel>> fetchAllUsers() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    String token = prefs.getString('token').toString();
    try {
      final response = await client.post(
          Uri.parse('http://192.168.31.163:8000/api/me'),
          headers: _header(token));

      final data = jsonDecode(response.body);

      if (data == null) {
        throw const ServerException(
          message: 'Please try again later',
          statusCode: 'Unknown Error',
        );
      }

      final List<dynamic> usersList = data["users"];
      print(usersList
          .map((json) => UserListModel.fromJson(json).toMap())
          .toList());
      final  userList =
          usersList.map((json) => UserListModel.fromJson(json)).toList();
    
      return userList;
    } on ServerException {
      rethrow;
    } catch (e, s) {
      debugPrintStack(stackTrace: s);
      throw ServerException(
        message: e.toString(),
        statusCode: '505',
      );
    }
  }
}

这是一个小部件,我试图在其中获取用户,并在小部件中显示它们作为项目列表

class UserListScreen extends StatelessWidget {
  const UserListScreen({super.key});
  static const routeName = '/users-list';
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: BlocConsumer<UserBlocBloc, UserBlocState>(
          listener: (_, state) {},
          builder: (context, state) {
            print(state);
            return ListView.builder(
              itemCount: state.users.length,
              itemBuilder: (context, index) {
                final users = state.users[index];
               
                ListTile(
                  title: Text('${user.first_name}'),
                  textColor: Colors.white70,
                );
              },
            );
          }),
    );
  }
}

这是用户的 Bloc 类

class UserBlocBloc extends Bloc<UserBlocEvent, UserBlocState> {
  UserBlocBloc({
    required FetchAllUsers fetchAllUsers,
  })  : _fetchAllUsers = fetchAllUsers,
        super(const UserBlocState()) {
    on<UserBlocEvent>((event, emit) {
      // TODO: implement event handler
    });
    on<FetchAllUsersEvent>(_fetchAllUsersHandler);
  }

  final FetchAllUsers _fetchAllUsers;

  Future<void> _fetchAllUsersHandler(
    FetchAllUsersEvent event,
    Emitter<UserBlocState> emit,
  ) async {
    final result = await _fetchAllUsers();
    print(result);
    result.fold(
      (failure) => emit(state.copyWith(status: UserBlocStatus.error)),
      (users) => emit(
        state.copyWith(
          status: UserBlocStatus.success,
          users: users,
        ),
      ),
    );
  }
}

这是来自 _fetchAllUsers() 的响应

[{id: 492d83be-e6b1-4b25-8845-87fc8f080756, username: admin, name: Dusko, last_name: Dusko, token: null}, {id: 9a5e7975-0920-4744-a651-b56720189586, username: vendor, name: sdfsdfs, last_name: sdfdsfsdf, token: null}, {id: 9a5fc3e9-1ae7-4257-8be0-d459237c92c6, username: employee, name: employee, last_name: employee, token: null}]

这就是我在小部件中打印状态时得到的

UserBlocState(UserBlocStatus.success, [UserListModel(492d83be-e6b1-4b25-8845-87fc8f080756, admin, Dusko, Dusko, null), UserListModel(9a5e7975-0920-4744-a651-b56720189586, vendor, sdfsdfs, sdfdsfsdf, null), UserListModel(9a5fc3e9-1ae7-4257-8be0-d459237c92c6, employee, employee, employee, null)])

我不确定我做错了什么。当我打印 state.users 时,长度为 3。但除此之外,我无法访问其中的任何项目。 希望有一个好的灵魂来引导我度过这个烂摊子......

安卓 Flutter Flutter-bloc

评论

0赞 Dusko 10/26/2023
我现在明白了,一切都很好,只是不得不循环列表。喜欢这个。。。users.map((item) => Text(item.first_name)).toList()。上帝保佑计算机

答:

0赞 Emanuel Balaban 10/26/2023 #1

唯一的问题似乎是回调内部的缺失:returnListView.builder

return ListView.builder(
  itemCount: state.users.length,
  itemBuilder: (context, index) {
    final users = state.users[index];
               
    return ListTile(
      title: Text('${user.first_name}'),
      textColor: Colors.white70,
    );
  },
);

你也能提供吗?看起来您尝试访问,但返回的 json 似乎没有它。UserListModelfirst_name_fetchAllUsers

0赞 Dusko 10/26/2023 #2

事实并非如此。我昨晚已经想通了。 只需要遍历列表。喜欢这个。。。。users.map((item) => Text(item.first_name)).toList()