提问人:Dusko 提问时间:10/26/2023 更新时间:10/28/2023 访问量:30
无法在 Flutter BlocConsumer 中获取正确的返回类型
Can't get the right return type in Flutter BlocConsumer
问:
我无法访问 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。但除此之外,我无法访问其中的任何项目。 希望有一个好的灵魂来引导我度过这个烂摊子......
答:
0赞
Emanuel Balaban
10/26/2023
#1
唯一的问题似乎是回调内部的缺失:return
ListView.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 似乎没有它。UserListModel
first_name
_fetchAllUsers
0赞
Dusko
10/26/2023
#2
事实并非如此。我昨晚已经想通了。
只需要遍历列表。喜欢这个。。。。users.map((item) => Text(item.first_name)).toList()
评论