如何将 flutter BLoC 流快照转换为自定义对象?
How to transform flutter BLoC stream snapshot into custom object?
我正在尝试在我的 flutter 应用程序中实现 BLoC 模式,
基本上这个应用程序会计算一些结果并将其显示在 table 中。
我创建了 CalculationResultProvider
和 CalculationResultBloc
如下
class CalculationResultProvider
{
List<EstimationResult> resultList = new List();
List<EstimationResult> calculateResult(){
return getInitialData(); }
List<EstimationResult> getInitialData(){
var cement = new EstimationResult();
cement.material = "Cement";
cement.unit = "Ton";
cement.qty = 10;
var sand = new EstimationResult();
sand.material = "Sand";
sand.unit = "Ton";
sand.qty = 12;
var gravel = new EstimationResult();
gravel.material = "Gravel";
gravel.unit = "Ton";
gravel.qty = 5;
var steel = new EstimationResult();
steel.material = "Steel";
steel.unit = "Ton";
steel.qty = 5;
List<EstimationResult> resultList = new List();
resultList.add(cement);
resultList.add(sand);
resultList.add(gravel);
resultList.add(steel);
return resultList; } }
和我的 BLoC 提供商 class 如下
class CalculationResultBloc {
final resultController = StreamController(); // create a StreamController
final CalculationResultProvider provider =
CalculationResultProvider(); // create an instance of our CounterProvider
Stream get getReult =>
resultController.stream; // create a getter for our stream
void updateResult() {
provider
.calculateResult(); // call the method to increase our count in the provider
resultController.sink.add(provider.resultList); // add the count to our sink
}
void dispose() {
resultController.close(); // close our StreamController
}
}
然后我需要在 table 小部件中显示此数据
class ResultTableWidget extends StatefulWidget {
@override
State<StatefulWidget> createState() => ResultTableWidgetState();
}
class ResultTableWidgetState extends State {
final bloc =
CalculationResultBloc(); // create an instance of the counter bloc
@override
Widget build(BuildContext context) {
return StreamBuilder(
stream: bloc.getReult,
initialData: CalculationResultProvider().getInitialData(),
builder: (context, snapshot) {
DataTable(
columns: [
DataColumn(label: Text('Patch')),
DataColumn(label: Text('Version')),
DataColumn(label: Text('Ready')),
],
rows:
'${snapshot.data}' // Loops through dataColumnText, each iteration assigning the value to element
.map(
((element) => DataRow(
cells: <DataCell>[
DataCell(Text(element[
"Name"])), //Extracting from Map element the value
DataCell(Text(element["Number"])),
DataCell(Text(element["State"])),
],
)),
)
.toList(),
);
});
}
@override
void dispose() {
bloc.dispose();
super.dispose();
}
}
要迭代返回 table 它应该是 List<EstimationResult>
但是如何将快照转换为 List<EstimationResult>
?
在 bloc class 或 widget class 中转换的最佳位置在哪里?
我是 dart 和 flutter 的新手,有人可以回答我的问题吗?
谢谢。
您的小部件 class 将不知道 StreamBuilder
中的流函数给出的数据类型,有很多方法可以在 BloC
中转换数据,然后再将其流式传输, 但所有这些都将无用,因为对于小部件 class 它只是一个 snapshot
,并且您在编译时可以访问的唯一字段是应用于通用快照的字段,如 data
字段.因此,访问自定义列表字段的唯一方法是为您的 StreamBuilder
提供其 stream
函数所期望的数据类型:
StreamBuilder<List<EstimationResult>>(
stream: bloc.getReult,
initialData: CalculationResultProvider().getInitialData(),
builder: (context, snapshot) {
//...
}
);
这样您就可以将 snapshot
视为 List<EstimationResult>
,并在收到实际快照之前访问内部字段和函数。在你的情况下,你可能应该将 EstimationResult
class 导入你的小部件 class.
我正在尝试在我的 flutter 应用程序中实现 BLoC 模式,
基本上这个应用程序会计算一些结果并将其显示在 table 中。
我创建了 CalculationResultProvider
和 CalculationResultBloc
如下
class CalculationResultProvider { List<EstimationResult> resultList = new List(); List<EstimationResult> calculateResult(){ return getInitialData(); } List<EstimationResult> getInitialData(){ var cement = new EstimationResult(); cement.material = "Cement"; cement.unit = "Ton"; cement.qty = 10; var sand = new EstimationResult(); sand.material = "Sand"; sand.unit = "Ton"; sand.qty = 12; var gravel = new EstimationResult(); gravel.material = "Gravel"; gravel.unit = "Ton"; gravel.qty = 5; var steel = new EstimationResult(); steel.material = "Steel"; steel.unit = "Ton"; steel.qty = 5; List<EstimationResult> resultList = new List(); resultList.add(cement); resultList.add(sand); resultList.add(gravel); resultList.add(steel); return resultList; } }
和我的 BLoC 提供商 class 如下
class CalculationResultBloc {
final resultController = StreamController(); // create a StreamController
final CalculationResultProvider provider =
CalculationResultProvider(); // create an instance of our CounterProvider
Stream get getReult =>
resultController.stream; // create a getter for our stream
void updateResult() {
provider
.calculateResult(); // call the method to increase our count in the provider
resultController.sink.add(provider.resultList); // add the count to our sink
}
void dispose() {
resultController.close(); // close our StreamController
}
}
然后我需要在 table 小部件中显示此数据
class ResultTableWidget extends StatefulWidget {
@override
State<StatefulWidget> createState() => ResultTableWidgetState();
}
class ResultTableWidgetState extends State {
final bloc =
CalculationResultBloc(); // create an instance of the counter bloc
@override
Widget build(BuildContext context) {
return StreamBuilder(
stream: bloc.getReult,
initialData: CalculationResultProvider().getInitialData(),
builder: (context, snapshot) {
DataTable(
columns: [
DataColumn(label: Text('Patch')),
DataColumn(label: Text('Version')),
DataColumn(label: Text('Ready')),
],
rows:
'${snapshot.data}' // Loops through dataColumnText, each iteration assigning the value to element
.map(
((element) => DataRow(
cells: <DataCell>[
DataCell(Text(element[
"Name"])), //Extracting from Map element the value
DataCell(Text(element["Number"])),
DataCell(Text(element["State"])),
],
)),
)
.toList(),
);
});
}
@override
void dispose() {
bloc.dispose();
super.dispose();
}
}
要迭代返回 table 它应该是 List<EstimationResult>
但是如何将快照转换为 List<EstimationResult>
?
在 bloc class 或 widget class 中转换的最佳位置在哪里?
我是 dart 和 flutter 的新手,有人可以回答我的问题吗?
谢谢。
您的小部件 class 将不知道 StreamBuilder
中的流函数给出的数据类型,有很多方法可以在 BloC
中转换数据,然后再将其流式传输, 但所有这些都将无用,因为对于小部件 class 它只是一个 snapshot
,并且您在编译时可以访问的唯一字段是应用于通用快照的字段,如 data
字段.因此,访问自定义列表字段的唯一方法是为您的 StreamBuilder
提供其 stream
函数所期望的数据类型:
StreamBuilder<List<EstimationResult>>(
stream: bloc.getReult,
initialData: CalculationResultProvider().getInitialData(),
builder: (context, snapshot) {
//...
}
);
这样您就可以将 snapshot
视为 List<EstimationResult>
,并在收到实际快照之前访问内部字段和函数。在你的情况下,你可能应该将 EstimationResult
class 导入你的小部件 class.