首页 > 解决方案 > 我收到颤振类型错误“响应”不是“FutureOr”的子类型'

问题描述

我想在颤动中解析一个 json 对象,但我无法让它显示在屏幕上。我收到一条错误消息,提示“响应”类型不是“FutureOr”的子类型。这是源代码


    Future<String> loadList() async {
      return await Network().getData('data');
    }
    
    class _IndexState extends State<Index> {
      bool _loading = true;
    
      Future loadList() async {
        String jsonString = await loadList();
        final response = json.decode(jsonString);
        Prospects prospects = new Prospects.fromJson(response);
        print(
            '${prospects.success} - ${prospects.data[0].id} - ${prospects.data[0].firstname} - ${prospects.data[0].lastname} - ${prospects.data[0].amountSpeculated}');
        return prospects;
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
            appBar: AppBar(
              title: Text(_loading ? 'Loading ' : 'JSON ListView in Flutter'),
            ),
            body: Center(
              child: FutureBuilder<String>(
                future: loadList(),
                builder: (context, snapshot) {
                  if (snapshot.hasData) {
                    return Text(snapshot.data);
                  } else if (snapshot.hasError) {
                    return Text("${snapshot.error}");
                  }
                  return CircularProgressIndicator();
                },
              ),
            ));
      }
    }

标签: jsonflutterserialization

解决方案


  1. 你的未来loadList()不是_loadList()
body: Center(
  child: FutureBuilder<String>(
    future: loadList(),
    builder: (context, snapshot) {
      if (snapshot.hasData) {
        return Text(snapshot.data);
      } else if (snapshot.hasError) {
        return Text("${snapshot.error}");
      }
      return CircularProgressIndicator();
    },
  ),
)
  1. 您的 Future 被定义为Future( Future<dynamic>) 而不是Future<String>
Future<String> loadList() async {
  String jsonString = await _loadList();
  final response = json.decode(jsonString);
  Prospects prospects = new Prospects.fromJson(response);
  return '${prospects.success} - ${prospects.data[0].id} - ${prospects.data[0].firstname} - ${prospects.data[0].lastname} - ${prospects.data[0].amountSpeculated}';
}

完整的源代码

import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';

void main() {
  runApp(
    MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Flutter Demo',
      home: HomePage(),
    ),
  );
}

class HomePage extends HookWidget {
  Future<String> loadList() async {
    await Future.delayed(Duration(seconds: 2));
    return ('My String');
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: FutureBuilder<String>(
          future: loadList(),
          builder: (context, snapshot) {
            if (snapshot.hasData) {
              return Text(snapshot.data);
            } else if (snapshot.hasError) {
              return Text("${snapshot.error}");
            }

            // By default, show a loading spinner.
            return CircularProgressIndicator();
          },
        ),
      ),
    );
  }
}

推荐阅读