我知道颤振中的状态管理存在某些问题,但它们似乎都不能解决我的用例。
最近我正在构建一个基于电子商务的应用程序,并遇到了这种对状态管理的真正需求。我有2页,
用户可以将产品添加到购物车,然后导航到购物车。在购物车页面中,他们还可以增加或减少商品的数量。
正如您所看到的,最初黄色商品被添加到购物车中,数量为 3,但在购物车页面中,用户按下 (-) 按钮,将数量减少到 1。现在,如果用户按下后退按钮,则状态为黄色产品在产品页面上仍为 3。与粉色产品类似的情况。
因此,我尝试使用正常的 setState 和一些全局数据结构来解决这个问题来跟踪数量。但随着我的应用程序变得越来越大,跨页面维护状态真的很困难。我读过不同的状态管理解决方案,例如 redux、BloC 模式、Provider,...但我不清楚如何在我的用例中使用它们。有没有有经验的人帮我把石头敲碎,帮我消化一下?
任何有关如何解决此问题的示例代码和解释将不胜感激!
希望我的问题是清楚的!
state-management flutter flutter-provider flutter-bloc flutter-state
我正在 flutter 中开发一个应用程序,它执行基于 OTP 的身份验证来登录。之前我正在管理类本身的状态,以便我可以使用 setState 方法来相应地呈现 UI。然后我改成 flutter_bloc cubit 模式来管理状态。但我不明白如何才能在一肘内记录多个状态。
考虑以下 State 和 Cubit 代码,
**State**.
@immutable
abstract class LoginState {}
class LoginInitial extends LoginState {
final Map loginState;
LoginInitial({this.loginState});
}
**Cubit**
class LoginCubit extends Cubit<LoginState> {
Map loginState = {
"isPhoneSubmitted": false,
"isOtpArrived": false,
};
LoginCubit()
: super(
LoginInitial(
loginState: {
"isPhoneSubmitted": false,
"isOtpArrived": false,
},
),
);
void sendOtp() {
emit(
LoginInitial(
loginState: {
"isPhoneSubmitted": true,
"isOtpArrived": false,
},
),
);
Future.delayed(Duration(seconds: 4), () {
emit(
LoginInitial( …Run Code Online (Sandbox Code Playgroud) 我有一个屏幕(A),它使用“AccountFetched”状态从数据库加载数据列表:
return BlocProvider<AccountBloc>(
create: (context) {
return _accountBloc..add(FetchAccountEvent());
},
child: BlocBuilder<AccountBloc, AccountState>(
builder: (context, state) {
if (state is AccountFetched) {
accounts = state.accounts;
}
Run Code Online (Sandbox Code Playgroud)
在我的第二个屏幕 (B) 中,我调用 AddAccountEvent 将数据添加到数据库并导航回父屏幕屏幕 (A)。
onPressed: () {
BlocProvider.of<AccountBloc>(context)
..add(AddAccountEvent(account: account));
Navigator.of(context).pop();
}
Run Code Online (Sandbox Code Playgroud)
但是当我导航回屏幕 A 时,数据列表并未更新。我应该手动刷新屏幕(A)还是如何更新块的状态?
这是我的集体课程:
class AccountBloc extends Bloc<AccountEvent, AccountState> {
AccountBloc() : super(AccountInitial());
@override
Stream<AccountState> mapEventToState(AccountEvent event) async* {
if (event is FetchAccountEvent) yield* _fetchAccountEvent(event, state);
if (event is AddAccountEvent) yield* _addAccountEvent(event, state);
}
Stream<AccountState> _fetchAccountEvent(
FetchAccountEvent event, AccountState state) async* …Run Code Online (Sandbox Code Playgroud) 我使用 Flutter 和 flutter_bloc 制作一个应用程序,它定期向我的服务器发送 API 请求并请求数据。在我使用计时器实现周期性功能之前,它最初工作得很好,这是我的块文件:
class HomeBeehivesBloc extends Bloc<HomeBeehivesEvent, HomeBeehivesState> {
HomeBeehivesBloc() : super(BeehivesInitial()) {
on<LoadBeehives>((event, emit) => _onBeehivesLoaded(emit));
}
Future<void> _onBeehivesLoaded(Emitter<HomeBeehivesState> emit) async {
emit(BeehivesLoading());
final repository = BeehivesRepository();
const duration = Duration(seconds: 5);
Timer.periodic(duration, (timer) async {
try {
await repository.getHomeBeehives().then((beehives) async {
emit(BeehivesLoadedSuccessfully(beehives: beehives));
});
} catch (exception) {
log(exception.toString());
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
但我得到了这个例外:
'package:bloc/src/emitter.dart': Failed assertion: line 114 pos 7: '!_isCompleted':
emit was called after an event handler completed normally.
This is usually …Run Code Online (Sandbox Code Playgroud) 我是 bloc 的新手,正在尝试使用包实现聊天flutter_bloc。我的消息传递服务是 twilio Conversations api。我的功能运行得很好,我只是无法刷新我的消息列表。有人可以告诉我我在这里缺少什么吗?如果我访问聊天页面,我可以看到所有消息,只有当我们有新消息时它才不会刷新。
由于取得了小小的成功,我更新了我的代码。每当用户 A 或用户 B 加入聊天时,都会显示所有消息。如果我以用户 A 的身份发送消息,则该消息现在将在用户 A 的 UI 中可见,并且它是对话的一部分,但用户 B 在不重新加载的情况下不会收到添加到对话中的新消息。这里缺少哪个步骤以便其他用户也收到消息?我只需要帮助转换我的代码,以便我有一个流,聊天的其他参与者可以收听,这样他们的对话也令人耳目一新。
\n我的 chat_event.dart
\n abstract class ChatEvent extends Equatable{\n const ChatEvent();\n\n @override\n List<Object> get props => [];\n}\n\nclass InitialChatEvent extends ChatEvent {}\n\nclass AddMessage extends ChatEvent {\n final String messageToPost;\n\n AddMessage(this.messageToPost);\n}\nRun Code Online (Sandbox Code Playgroud)\n我的 chat_state.dart
\n class ChatState extends Equatable {\n final Messages messages;\n\n const ChatState({required this.messages});\n\n factory ChatState.initial() => ChatState(messages: Messages(messages: []));\n\n @override\n List<Object> get props => [messages];\n\n @override\n …Run Code Online (Sandbox Code Playgroud) flutter bloc flutter-bloc twilio-conversations flutter-streambuilder
我正在尝试修改列表中的项目值,这总是会导致Can't modify list because of Unsupported operation: Cannot modify an unmodifiable list
我正在使用块状态管理和冻结作为代码生成器。这是我的代码:
从服务器获取角色并将列表添加到角色
Future<RoleWithNeeds> getRoleWithNeeds({
required RoleWithNeeds selectedRoles,
}) async {
final dataFromApi = await _apiClient.fetchNeedsByRoles(selectedRoles.idRole);
final needsApi = dataFromApi.data;
final needsRepository = <Need>[];
// convert to a repository model
for (var i = 0; i < needsApi.length; i++) {
needsRepository.add(Need(
id: needsApi[i].id,
name: needsApi[i].name,
createdAt: needsApi[i].createdAt,
));
}
return selectedRoles.copyWith(needs: needsRepository);
}
Run Code Online (Sandbox Code Playgroud)
当我尝试修改 RoleWithNeeds 中的嵌套数组时的部分
FutureOr<void> _onClickNeed(_ClickNeed event, Emitter<NeedState> emit) {
emit(_Load());
try {
for (var role …Run Code Online (Sandbox Code Playgroud) 也许我不明白 BloC 或 Provider 的目的,但我很困惑为什么我们想要使用它们而不是使用 Flutter 的内置状态管理(使用 widget)Stateful。我刚刚完成了一个应用程序,但不记得我希望我需要比默认值更多的东西。有人可以帮我解决问题吗?
\n错误:I / flutter(5919):\ xe2 \ x95 \ x90 \ xe2 \ x95 \ x90 \ xe2 \ x95 \ xa1小部件库捕获异常\ n \ xe2 \ x95 \ x9e \ xe2 \ x95 \ x90 \ xe2 \ x95 \x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90 \xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2 \x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95 \x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90 \xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2 \x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95 \x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90 I/颤动\n ( 5919): 构建 Builder 时抛出以下断言:\n I/flutter (5919): 使用不包含 Bloc 类型的 Bloc 的上下文调用 BlocProvider.of()。I/flutter ( 5919):从传递给 I/flutter ( 5919) 的上下文开始找不到祖先:\n BlocProvider.of>()。I/flutter ( 5919):
\n 如果您使用的上下文来自 BlocProvider 之上的小部件,则可能会发生这种情况。I/flutter(5919):使用的上下文是:\n BlocBuilder,动态>(脏,状态:I/flutter(\n 5919):_BlocBuilderBaseState,\n动态>#55a7d(生命周期状态:已创建))I/flutter ( 5919): 相关的导致错误的小部件是: I/flutter ( 5919): …
我想将文本 Update BlocBuilder 嵌套在另一个 BlocBuilder 中,该 BlocBuilder 通过滑块小部件控制其字体大小。但是,我无法让它工作。请帮忙!
BlocBuilder<SettingsBloc, SettingsState>(
builder: (context, state) {
return BlocBuilder<TextFieldBloc, TextFieldState>(
builder: (context, state) {
if (state is TextFieldInitState) {
return Text(
state.text.toString(),
style: TextStyle(
fontSize: state.fontSize,
fontFamily: 'EthiopicWookianos',
fontWeight: FontWeight.normal,
color: Colors.blueGrey,
),
);
} else if (state is TextFieldLaterState) {
return Text(
state.text.toString(),
style: TextStyle(
fontSize: state.fontSize,
fontFamily: 'EthiopicWookianos',
fontWeight: FontWeight.normal,
color: Colors.blueGrey,
),
);
} else {
return Text("something wrong");
}
});
}),
Run Code Online (Sandbox Code Playgroud)
这是 TextField Bloc 的代码...(当然它们在单独的文件中)。
import 'package:flutter/widgets.dart';
abstract class …Run Code Online (Sandbox Code Playgroud) 我是颤振和块的新手。事实上,我最近才开始使用 cubit。出于学习目的,我创建了一个简单的应用程序,在其中使用 cubit 来实现 bloc 功能。在我在网上找到的所有示例中,他们建议在 UI 中处理 bloc 实例。但是,当涉及到肘时,我没有找到类似的东西。所以,我的问题是:我是否需要处理 cubit 实例以及如何处理?这里值得一提的是,我正在使用 MultiBlocProvider。