getter 'length' 被调用为 null。从 api 获取

时间:2021-04-27 08:21:34

标签: flutter dart

我正在尝试从我的应用程序启动画面的 api 获取数据我希望用户在应用程序启动时等待 5 秒然后转到下一个屏幕但是当我尝试从 api 获取数据时我收到了调用 getter 'length'在空。请帮助我这是我的代码我尝试解决它的其他资源数量但未能找到解决方案这就是为什么我在这里发布我的问题请检查并帮助

import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter_app/main.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';


void main() {
  runApp(new MaterialApp(
    home: new SplashScreen(),
    debugShowCheckedModeBanner: false,
    routes: <String, WidgetBuilder>{
      '/MyHomePage': (BuildContext context) => new MyHomePage()
    },
  ));
}

class SplashScreen extends StatefulWidget {
  @override
  _SplashScreenState createState() => new _SplashScreenState();
}

class _SplashScreenState extends State<SplashScreen> {

  startTime() async {
    var _duration = new Duration(seconds: 5);
    return new Timer(_duration, navigationPage);
  }

  void navigationPage() {
    Navigator.of(context).pushReplacementNamed('/MyHomePage');
  }
  bool _loading=true;
  Map data;
  List userData=null;
  Future getData() async {
    http.Response response = await http.get("https://livinghopemobile.com/public/api/fetch-site-settings?token=123ab_@_@AbCD");
    data = json.decode(response.body);
    debugPrint(response.body);
    setState(() {
      userData = data["data"];
      _loading=false;
      // print(userData[0]['title']);
    });

  }

  @override
  void initState() {
    super.initState();

    //startTime();
    getData();
  }


  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      body: ListView.builder(
          itemCount:userData.length,
          itemBuilder: (context, index) {

return Container(
  child: Image.network(userData[index]['site_logo']),
);
          }

      )

      );

  }
}

Launching lib/ui/SplashScreen.dart on iPhone 11 Pro Max in debug mode...
Running Xcode build...
Xcode build done.                                           23.8s
Debug service listening on ws://127.0.0.1:60469/bL7bmRYyhoc=/ws
Syncing files to device iPhone 11 Pro Max...

════════ Exception caught by widgets library ═══════════════════════════════════════════════════════
The following NoSuchMethodError was thrown building SplashScreen(dirty, state: _SplashScreenState#5fa75):
The getter 'length' was called on null.
Receiver: null
Tried calling: length

The relevant error-causing widget was: 
  SplashScreen file:///Users/apple/livinghopev4/livinghope4ios/lib/ui/SplashScreen.dart:10:15
When the exception was thrown, this was the stack: 
#0      Object.noSuchMethod (dart:core-patch/object_patch.dart:54:5)
#1      _SplashScreenState.build (package:flutter_app/ui/SplashScreen.dart:61:30)
#2      StatefulElement.build (package:flutter/src/widgets/framework.dart:4612:27)
#3      ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4495:15)
#4      StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4667:11)
...
════════════════════════════════════════════════════════════════════════════════════════════════════
flutter: {"status":200,"message":"Data fetched successfully","data":{"id":1,"site_logo":"https:\/\/livinghopemobile.com\/public\/storage\/site_logo\/270421_122025_image.png","site_name":"Living hope","created_at":null,"updated_at":"2021-04-27T07:20:26.000000Z"}}
[VERBOSE-2:ui_dart_state.cc(186)] Unhandled Exception: type '_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'List<dynamic>'
#0      _SplashScreenState.getData.<anonymous closure> (package:flutter_app/ui/SplashScreen.dart:41:7)
#1      State.setState (package:flutter/src/widgets/framework.dart:1267:30)
#2      _SplashScreenState.getData (package:flutter_app/ui/SplashScreen.dart:40:5)
<asynchronous suspension>

3 个答案:

答案 0 :(得分:0)

这是因为数据不是 List 类型,并且 userData 为空,因此在 ListView.builder 中调用 userData.length 时它没有长度。

将 null 改为 []。

{"status":200,"message":"Data fetched successfully","data":{"id":1,"site_logo":"https:\/\/livinghopemobile.com\/public\/storage\/site_logo\/270421_122025_image.png","site_name":"Living hope","created_at":null,"updated_at":"2021-04-27T07:20:26.000000Z"}}

您可以将接收到的数据附加到 userData,例如:userData.add(data)

答案 1 :(得分:0)

你试试:

itemCount:userData.length == null ? 0 : userData.length

答案 2 :(得分:0)

数据在 Object 中返回,您将其视为 List。这就是您收到错误的原因。

解决办法: 不要使用 Listview.builder,因为 api 响应只是一个对象(Map)。

你可以简单地使用

Image.network(userData['site_logo']),

一切都会好的。