gpt4 book ai didi

flutter - 如何管理同一 Bloc 内的不同国家? flutter

转载 作者:行者123 更新时间:2023-12-05 05:53:17 25 4
gpt4 key购买 nike

我试图在我的应用程序中处理 3 种不同的状态,在我家的 initState 中,我将事件称为“OnInitial”,假装是一种从本地数据库获取数据的方法。

正如您在方法中看到的那样,我将“6”设置为变量“number”,就像我所说的那样,假装这是我从数据库中获取的数据。我的事件完成获取数据并发出状态“ProductsTercero”,其中已经包含“分配的数据”。

在我的家里,如果状态是 ProductsTercero,我会用“msg”和“number”绘制一个列。当 inital 完成时,我的屏幕被正确重绘并显示

enter image description here

但我的问题如下。当我按下触发事件“OnTercero”的名为“Tercero”的按钮时在我的 Bloc 中,当调用此事件时,它会将“新消息”设置为 ProducsTercero 的变量“消息”。这是做什么的?下一个:

enter image description here

它删除了我之前设置的“数字 6”,也就是说,关于模拟,我将删除我从数据库中带来的所有数据。

我的预期结果是:

New msg
6

但是我得到了

New msg
0

我进行了调试,它似乎总是在创建一个新的 ProductsThird 对象。即使我做了 ProductsTercero().copyWith(msg: 'New msg');是一样的。

我只使用过 1 个状态,但这种情况并没有发生在我身上,因为我总是执行 state.copyWith();并且无论我是否传递它具有的 5 个属性中的 1 个属性,该状态的其他值始终保持不变。但是在这里,有多个状态并且有一个抽象状态类,我不能写 emit(state.copyWith(msg: 'New msg');

我做错了什么?在 X 状态下发射并且不会发生这种情况的正确方法是什么?

事件、状态和区 block 代码:

part of 'products_bloc.dart';

@immutable
abstract class ProductsEvent {}

class OnInitial extends ProductsEvent {}
class OnSegundo extends ProductsEvent {}
class OnTercero extends ProductsEvent {}

//**************************************************************//

part of 'products_bloc.dart';

@immutable
abstract class ProductsState {}

class ProductsInitial extends ProductsState {
final String? msg;
final int? numero;

ProductsInitial({numero, msg})
: msg = msg ?? 'MSG: Default Inicial',
numero = numero ?? 0;
ProductsInitial copywith({String? msg, int? numero}) =>
ProductsInitial(msg: msg ?? this.msg, numero: numero ?? this.numero);
}

class ProductsSegundo extends ProductsState {
final String? msg;
final int? numero;

ProductsSegundo({numero, msg})
: msg = msg ?? 'Second: Default Msg',
numero = numero ?? 0;
ProductsSegundo copywith({String? msg, int? numero}) =>
ProductsSegundo(msg: msg ?? this.msg, numero: numero ?? this.numero);
}

class ProductsTercero extends ProductsState {
final String? msg;
final int? numero;

ProductsTercero({numero, msg})
: msg = msg ?? 'Third: Default Msg',
numero = numero ?? 0;
ProductsTercero copywith({String? msg, int? numero}) =>
ProductsTercero(msg: msg ?? this.msg, numero: numero ?? this.numero);
}


//**********************************************************//

import 'package:bloc/bloc.dart';
import 'package:meta/meta.dart';

part 'products_event.dart';
part 'products_state.dart';

class ProductsBloc extends Bloc<ProductsEvent, ProductsState> {
ProductsBloc() : super(ProductsInitial()) {
on<OnInitial>((event, emit) {
emit(ProductsInitial().copywith(
msg: 'Initial msg'
));
emit(ProductsTercero(numero: 6));
});


on<OnSegundo>((event, emit) {
emit(ProductsSegundo());
});


on<OnTercero>((event, emit) {
emit(ProductsTercero(msg: 'New msg'));
});
}
}

首页代码:

import 'package:bloc_test/src/bloc/products/products_bloc.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';

class HomePage extends StatefulWidget {
const HomePage({Key? key}) : super(key: key);

@override
State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {

@override
void initState() {
BlocProvider.of<ProductsBloc>(context).add(OnInitial());
super.initState();
}
@override
Widget build(BuildContext context) {
return BlocBuilder<ProductsBloc, ProductsState>(
builder: (context, state) {
return Scaffold(
body: Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
(state is ProductsInitial) ? Column(
children: [
Center(child: Text(state.msg!)),
Center(child: Text(state.numero!.toString())),
],
)
: (state is ProductsSegundo) ? Column(
children: [
Center(child: Text(state.msg!)),
Center(child: Text(state.numero!.toString())),
],
)
: (state is ProductsTercero) ? Column(
children: [
Center(child: Text(state.msg!)),
Center(child: Text(state.numero!.toString())),
],
)
: Center(child: Text('Nada')),
SizedBox(
height: 40,
width: double.infinity,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: <Widget>[
ElevatedButton(
onPressed: () {
BlocProvider.of<ProductsBloc>(context).add(OnInitial());
},
child: Text('Initial')),
ElevatedButton(
onPressed: () {
BlocProvider.of<ProductsBloc>(context).add(OnSegundo());
},
child: Text('Segundo')),
ElevatedButton(
onPressed: () {
BlocProvider.of<ProductsBloc>(context).add(OnTercero());
},
child: Text('Tercero'))
],
),
),
],
),
);
},
);
}
}

最佳答案

您没有在 emit(ProductsTercero(msg: 'New msg')); 上传递 num 值

因为 num == null 然后它被设置为 0,如您的代码所定义。

尝试像下面这样替换

on<OnTercero>((event, emit) {
emit(ProductsTercero(msg: 'New msg',numero: 6));
});

关于flutter - 如何管理同一 Bloc 内的不同国家? flutter ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69912666/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com