Flutter 颤振与复飞
我写了一个使用Redux管理我的状态的应用程序。我不知道为什么,但当我启动我的应用程序时,我的控制台会向我抛出此类错误:Flutter 颤振与复飞,flutter,dart,redux,Flutter,Dart,Redux,我写了一个使用Redux管理我的状态的应用程序。我不知道为什么,但当我启动我的应用程序时,我的控制台会向我抛出此类错误: The getter 'length' was called on null. Receiver: null Tried calling: length 我只是一个使用redux的初学者,所以如果这只是一个小的、有趣的错误,请原谅:) 我将代码粘贴到下面: 订单号 class OrdersScreen extends StatelessWidget{ void hand
The getter 'length' was called on null.
Receiver: null
Tried calling: length
我只是一个使用redux的初学者,所以如果这只是一个小的、有趣的错误,请原谅:)
我将代码粘贴到下面:
订单号
class OrdersScreen extends StatelessWidget{
void handleInitialBuild(OrdersScreenProps props){
props.getOrders();
}
@override
Widget build(BuildContext context){
return StoreConnector<AppState, OrdersScreenProps>(
converter: (store) => mapStateToProps(store),
onInitialBuild: (props) => this.handleInitialBuild(props),
builder: (context, props){
List<Order> data = props.listResponse.data;
bool loading = props.listResponse.loading;
Widget body;
if(loading){
body = Center(
child: CircularProgressIndicator(),
);
}else{
body = ListView.separated(
padding: const EdgeInsets.all(16.0),
itemCount: data.length,
separatorBuilder: (context, index) => Divider(),
itemBuilder: (context, i) {
Order order = data[i];
return ListTile(
title: Text(
order.title,
),
onTap: () {
props.getOrderDetails(order.id);
Navigator.pushNamed(context, AppRoutes.orderDetails);
},
);
},
);
}
return Scaffold(
appBar: AppBar(
title: Text('Orders list'),
),
body: body,
);
},
);
}
}
class OrdersScreenProps {
final Function getOrders;
final Function getOrderDetails;
final ListOrdersState listResponse;
OrdersScreenProps({
this.getOrders,
this.listResponse,
this.getOrderDetails,
});
}
OrdersScreenProps mapStateToProps(Store<AppState> store) {
return OrdersScreenProps(
listResponse: store.state.order.list,
getOrders: () => store.dispatch(getOrders()),
getOrderDetails: (int id) => store.dispatch(getOrderDetails(id)),
);
}
订单号
OrderState orderResucer(OrderState state, FSA action){
OrderState newState = state;
switch (action.type) {
case LIST_ORDERS_REQUEST:
newState.list.error = null;
newState.list.loading = true;
newState.list.data = null;
return newState;
case LIST_ORDERS_SUCCESS:
newState.list.error = null;
newState.list.loading = false;
newState.list.data = ordersFromJSONStr(action.payload);
return newState;
case LIST_ORDERS_FAILURE:
newState.list.error = action.payload;
newState.list.loading = false;
newState.list.data = null;
return newState;
case GET_ORDERS_DETAILS_REQUEST:
newState.details.error = null;
newState.details.loading = true;
newState.details.data = null;
return newState;
case GET_ORDERS_DETAILS_SUCCESS:
newState.details.error = null;
newState.details.loading = false;
newState.details.data = orderFromJSONStr(action.payload);
return newState;
case GET_ORDERS_DETAILS_FAILURE:
newState.details.error = action.payload;
newState.details.loading = false;
newState.details.data = null;
return newState;
default:
return newState;
}
}
List<Order> ordersFromJSONStr(dynamic payload) {
Iterable jsonArray = json.decode(payload);
return jsonArray.map((j) => Order.fromJSON(j)).toList();
}
OrderDetails orderFromJSONStr(dynamic payload) {
return OrderDetails.fromJSON(json.decode(payload));
}
OrderState orderResucer(OrderState,FSA操作){
OrderState newState=状态;
开关(动作类型){
案例列表\u订单\u请求:
newState.list.error=null;
newState.list.load=true;
newState.list.data=null;
返回新闻状态;
案例列表\u订单\u成功:
newState.list.error=null;
newState.list.load=false;
newState.list.data=ordersFromJSONStr(action.payload);
返回新闻状态;
案例列表\u订单\u失败:
newState.list.error=action.payload;
newState.list.load=false;
newState.list.data=null;
返回新闻状态;
案例获取\订单\详细信息\请求:
newState.details.error=null;
newState.details.loading=true;
newState.details.data=null;
返回新闻状态;
案例获取\订单\详细信息\成功:
newState.details.error=null;
newState.details.loading=false;
newState.details.data=orderFromJSONStr(action.payload);
返回新闻状态;
案例获取\订单\详细信息\失败:
newState.details.error=action.payload;
newState.details.loading=false;
newState.details.data=null;
返回新闻状态;
违约:
返回新闻状态;
}
}
列表ordersFromJSONStr(动态有效负载){
Iterable jsonArray=json.decode(有效载荷);
返回jsonArray.map((j)=>Order.fromJSON(j)).toList();
}
OrderDetails orderFromJSONStr(动态负载){
返回OrderDetails.fromJSON(json.decode(payload));
}
您需要做的第一件事是对减速器执行操作,并调用相关操作以更改状态
TypedReducer<OrderState, FSA>(orderReducer>); //pass it your reducers in store
TypedReducer(orderReducer>)//把它传给你的减速机
触发相关行动
ThunkAction<AppState> getOrders() => (Store<AppState> store) ={
store.dispatch(FSA(type: LIST_ORDERS_REQUEST);
store.dispatch(getOrdersRequest().then((orders){
store.dispatch(FSA(type: LIST_ORDERS_REQUEST);
}), onError(e){
store.dispatch(FSA(type: LIST_ORDERS_FAILURE);
}
};
ThunkAction getOrders()=>(存储)={
存储调度(FSA(类型:列表、订单和请求);
store.dispatch(getOrdersRequest()。然后((订单){
存储调度(FSA(类型:列表、订单和请求);
}),onError(e){
存储调度(FSA(类型:列表\订单\失败);
}
};
getOrders()应该返回future。执行ThunkAction的全部目的是返回一个函数,一旦其中的异步函数完成,该函数就会分派常规的同步操作
OrderState orderResucer(OrderState state, FSA action){
OrderState newState = state;
switch (action.type) {
case LIST_ORDERS_REQUEST:
newState.list.error = null;
newState.list.loading = true;
newState.list.data = null;
return newState;
case LIST_ORDERS_SUCCESS:
newState.list.error = null;
newState.list.loading = false;
newState.list.data = ordersFromJSONStr(action.payload);
return newState;
case LIST_ORDERS_FAILURE:
newState.list.error = action.payload;
newState.list.loading = false;
newState.list.data = null;
return newState;
case GET_ORDERS_DETAILS_REQUEST:
newState.details.error = null;
newState.details.loading = true;
newState.details.data = null;
return newState;
case GET_ORDERS_DETAILS_SUCCESS:
newState.details.error = null;
newState.details.loading = false;
newState.details.data = orderFromJSONStr(action.payload);
return newState;
case GET_ORDERS_DETAILS_FAILURE:
newState.details.error = action.payload;
newState.details.loading = false;
newState.details.data = null;
return newState;
default:
return newState;
}
}
List<Order> ordersFromJSONStr(dynamic payload) {
Iterable jsonArray = json.decode(payload);
return jsonArray.map((j) => Order.fromJSON(j)).toList();
}
OrderDetails orderFromJSONStr(dynamic payload) {
return OrderDetails.fromJSON(json.decode(payload));
}
TypedReducer<OrderState, FSA>(orderReducer>); //pass it your reducers in store
ThunkAction<AppState> getOrders() => (Store<AppState> store) ={
store.dispatch(FSA(type: LIST_ORDERS_REQUEST);
store.dispatch(getOrdersRequest().then((orders){
store.dispatch(FSA(type: LIST_ORDERS_REQUEST);
}), onError(e){
store.dispatch(FSA(type: LIST_ORDERS_FAILURE);
}
};