【问题标题】:type '() => Future<List<Food>>' is not a subtype of type <List<Food>type '() => Future<List<Food>>' 不是 <List<Food> 类型的子类型
【发布时间】:2020-10-13 21:06:16
【问题描述】:

我是新来的颤振。当我运行我的代码时,我得到了错误

 E/flutter (16181): [ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: Unhandled error type '() => Future<List<Food>>' is not a subtype of type 'List<Food>' occurred in Instance of 'MenuBloc'.
E/flutter (16181): #0      MenuBloc.mapEventToState (package:restuarant_app/Bloc/menue_bloc/menu_bloc.dart:30:7)
E/flutter (16181): <asynchronous suspension>
E/flutter (16181): #1      Bloc._bindEventsToStates.<anonymous closure> (package:bloc/src/bloc.dart:232:20)
E/flutter (16181): #2      Stream.asyncExpand.onListen.<anonymous closure> (dart:async/stream.dart:579:30)
E/flutter (16181): #3      _rootRunUnary (dart:async/zone.dart:1192:38)
E/flutter (16181): #4      _CustomZone.runUnary (dart:async/zone.dart:1085:19)
E/flutter (16181): #5      _CustomZone.runUnaryGuarded (dart:async/zone.dart:987:7)
E/flutter (16181): #6      _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:339:11)
E/flutter (16181): #7      _DelayedData.perform (dart:async/stream_impl.dart:594:14)
E/flutter (16181): #8      _StreamImplEvents.handleNext (dart:async/stream_impl.dart:710:11)
E/flutter (16181): #9      _PendingEvents.schedule.<anonymous closure> (dart:async/stream_impl.dart:670:7)
E/flutter (16181): #10     _rootRun (dart:async/zone.dart:1180:38)
E/flutter (16181): #11     _CustomZone.run (dart:async/zone.dart:1077:19)
E/flutter (16181): #12     _CustomZone.runGuarded (dart:async/zone.dart:979:7)
E/flutter (16181): #13     _CustomZone.bindCallbackGuarded.<anonymous closure> (dart:async/zone.dart:1019:23)
E/flutter (16181): #14     _rootRun (dart:async/zone.dart:1184:13)
E/flutter (16181): #15     _CustomZone.run (dart:async/zone.dart:1077:19)
E/flutter (16181): #16     _CustomZone.runGuarded (dart:async/zone.dart:979:7)
E/flutter (16181): #17     _CustomZone.bindCallbackGuarded.<anonymous closure> (dart:async/zone.dart:1019:23)
E/flutter (16181): #18     _microtaskLoop (dart:async/schedule_microtask.dart:43:21)
E/flutter (16181): #19     _startMicrotaskLoop (dart:async/schedule_microtask.dart:52:5)
E/flutter (16181): 
E/flutter (16181): #0      Cubit.onError.<anonymous closure> (package:bloc/src/cubit.dart:140:7)
E/flutter (16181): #1      Cubit.onError (package:bloc/src/cubit.dart:141:6)
E/flutter (16181): #2      Bloc.onError (package:bloc/src/bloc.dart:113:11)
E/flutter (16181): #3      _rootRunBinary (dart:async/zone.dart:1204:38)
E/flutter (16181): #4      _CustomZone.runBinary (dart:async/zone.dart:1093:19)
E/flutter (16181): #5      _CustomZone.runBinaryGuarded (dart:async/zone.dart:995:7)
E/flutter (16181): #6      _BufferingStreamSubscription._sendError.sendError (dart:async/stream_impl.dart:358:15)
E/flutter (16181): #7      _BufferingStreamSubscription._sendError (dart:async/stream_impl.dart:376:16)
E/flutter (16181): #8      _BufferingStreamSubscription._addError (dart:async/stream_impl.dart:275:7)
E/flutter (16181): #9      _SyncBroadcastStreamController._sendError.<anonymous closure> (dart:async/broadcast_stream_controller.dart:393:20)
E/flutter (16181): #10     _BroadcastStreamController._forEachListener (dart:async/broadcast_stream_controller.dart:327:15)
E/flutter (16181): #11     _SyncBroadcastStreamController._sendError (dart:async/broadcast_stream_controller.dart:392:5)
E/flutter (16181): #12     _BroadcastStreamController._addError (dart:async/broadcast_stream_controller.dart:294:5)
E/flutter (16181): #13     _rootRunBinary (dart:async/zone.dart:1204:38)
E/flutter (16181): #14     _CustomZone.runBinary (dart:async/zone.dart:1093:19)
E/flutter (16181): #15     _CustomZone.runBinaryGuarded (dart:async/zone.dart:995:7)
E/flutter (16181): #16     _BufferingStreamSubscription._sendError.sendError (dart:async/stream_impl.dart:358:15)
E/flutter (16181): #17     _BufferingStreamSubscription._sendError (dart:async/stream_impl.dart:376:16)
E/flutter (16181): #18     _BufferingStreamSubscription._addError (dart:async/stream_impl.dart:275:7)
E/flutter (16181): #19     _ForwardingStreamSubscription._addError (dart:async/stream_pipe.dart:139:11)
E/flutter (16181): #20     _ForwardingStream._handleError (dart:async/stream_pipe.dart:104:10)
E/flutter (16181): #21     _ForwardingStreamSubscription._handleError (dart:async/stream_pipe.dart:170:13)
E/flutter (16181): #22     _rootRunBinary (dart:async/zone.dart:1204:38)
E/flutter (16181): #23     _CustomZone.runBinary (dart:async/zone.dart:1093:19)
E/flutter (16181): #24     _CustomZone.runBinaryGuarded (dart:async/zone.dart:995:7)
E/flutter (16181): #25     _BufferingStreamSubscription._sendError.sendError (dart:async/stream_impl.dart:358:15)
E/flutter (16181): #26     _BufferingStreamSubscription._sendError (dart:async/stream_impl.dart:376:16)
E/flutter (16181): #27     _DelayedError.perform (dart:async/stream_impl.dart:605:14)
E/flutter (16181): #28     _StreamImplEvents.handleNext (dart:async/stream_impl.dart:710:11)
E/flutter (16181): #29     _PendingEvents.schedule.<anonymous closure> (dart:async/stream_impl.dart:670:7)
E/flutter (16181): #30     _rootRun (dart:async/zone.dart:1180:38)
E/flutter (16181): #31     _C

我想从远程服务器获取数据。我在代码中使用 bloc 库。 这是 menue_bloc.dart 的一部分。我在allFood= await _foodRepositiry.getAllFood() ; 线上遇到了错误。

class MenuBloc extends Bloc<FoodEvent, MenuState> {
  final _foodRepositiry = FoodRepository();
  Map<String, List<Food>> mapFoodList;

  MenuBloc({this.mapFoodList=const{}}) : super(InitialMenuState());
 @override
  // TODO: implement initialState
  MenuState get initialState => InitialMenuState();

  @override
  Stream<MenuState> mapEventToState(FoodEvent event) async* {
    print("loading....");
    yield Loading();
    if (event is GetAllFoodEvent) {
      print("Get all food....");
      this.mapFoodList = {};
      List<Food> allFood;

      allFood= await _foodRepositiry.getAllFood() ;
                try {
        print("in menu bloc...... ");

        allFood.forEach((food) {
          print(food.toString());
          if (!this.mapFoodList.containsKey(food.category)) {
            this.mapFoodList[food.category.toString()] = [];
          }

          this.mapFoodList[food.category].add(food);
        });

        yield Loaded(mapFoodList: this.mapFoodList);
      } catch (e, stacktrace) {
        print(e.toString());
        print(stacktrace.toString());

当我将 List&lt;Food&gt; allFood; 更改为 Future&lt;List&lt;Food&gt;&gt; allFood; 时,出现以下错误

I/flutter (16181): type '() => Future<List<Food>>' is not a subtype of type 'Future<List<Food>>'

此 FoodRepository 代码。

class FoodRepository{
  final foodDao=new FoodDao();
  final foodApiClient =new FoodApiClient();
  Future getAllFood() async{
    if(await checkInternetConnection()) {
      print("fetch data from remote server");
     return  foodApiClient.fetchAllFood;
    }else{
     print("from db");
     return foodDao.getAllFood();
   }

  }
}

这是 FoodApiClient 代码:

class FoodApiClient{
  static const baseUrl = '10.0.2.2';
  final http.Client httpClient;

  FoodApiClient({this.httpClient});
  Future<List<Food>> fetchAllFood()async{
    String url=":8080/resturant/food/allFood";
   // print(url);
    List<Food> foodList;
    print(url);
    final allFoodResponse=await httpClient.get(baseUrl+url);
    print(allFoodResponse);
    if (allFoodResponse.statusCode != 200) {
      throw Exception('An error occured while loading food list!!! status code: '+allFoodResponse.statusCode.toString());
    }
    print("foodJson");
    List foodJson = json.decode(allFoodResponse.body);
    print(foodJson);
    //foodJson.forEach((food) {foodList.add(Food.fromJson(food)); });
    foodList=foodJson.map((f)=>Food.fromJson(f)).toList();
    return   foodList;
  }

}

【问题讨论】:

标签: flutter dart async-await


【解决方案1】:
Future getAllFood() async{

需要

Future<List<Food>> getAllFood() async {

然后您需要从那里跟踪编译器错误,因为还有很多实例我无法在此处全部命名和描述。


我强烈建议您使用正确的 dart 格式,并使用包 pedantic 告诉您有关您的代码的所有信息以及如果您自己找不到这些地方如何改进它。

【讨论】:

  • 当我根据您的建议进行更改时,我收到此错误编译器消息:lib/Repository/FoodRepository.dart:12:28: Error: A value of type 'Future> Function() ' 不能分配给 'FutureOr>' 类型的变量。 - “未来”来自“飞镖:异步”。 - “列表”来自“飞镖:核心”。 - “食物”来自“package:restuarant_app/Model/Food.dart”(“lib/Model/Food.dart”)。 - 'FutureOr' 来自 'dart:async'。返回 foodApiClient.fetchAllFood;
  • 是的,这正是我告诉你的。你能发现你的错误吗?
  • 对不起,我不能,我不知道该怎么办
  • 这应该是函数调用吗?也许你错过了()
  • return foodApiClient.fetchAllFood; 需要一组(),因为它应该是一个函数调用。
猜你喜欢
  • 2021-08-25
  • 2020-09-20
  • 1970-01-01
  • 2020-04-07
  • 2020-09-18
  • 1970-01-01
  • 1970-01-01
  • 2021-12-08
  • 1970-01-01
相关资源
最近更新 更多