首页 > 解决方案 > FutureBuilder 构建错误而不是正常部分

问题描述

我花了几天时间调试,但似乎我没有足够的经验或做错了什么。

我创建了一个小的复制过去准备好的错误示例:

import 'dart:convert';

import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;

class TotalDbStat {
  int notificationsTotalCount;

  TotalDbStat({
    this.notificationsTotalCount,    
    });

  factory TotalDbStat.fromJson(Map<String, dynamic> json)  {
      return TotalDbStat(
        notificationsTotalCount: 123
      );
  }

}

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {

    Future<TotalDbStat>  answer = jobStatusTotal();
  
    @override
    build(BuildContext context) {
      return FutureBuilder<TotalDbStat> (
        future: answer,
        builder: (context, snapshot)  {
        switch (snapshot.connectionState)  {
          case ConnectionState.waiting: 
              return Text('Loading....');
          default:
            if (snapshot.hasData) {     
              print(snapshot.data);              
              return Text(snapshot.data.notificationsTotalCount.toString());
            } else if (snapshot.hasError) {
              print(snapshot);
              return Text("${snapshot.error}");
            }

            return Text("data");

        }

        }
      );
    }

  }

Future<TotalDbStat> jobStatusTotal() async {
   http.get('http://127.0.0.1:5001/status?total').then((value) {
     if(value.statusCode == 200) {
        Map<String, dynamic> valueMap = jsonDecode(value.body)['data'];
        print(valueMap); // this part work I see in console: {notificationsTotalCount: 3948}
        return TotalDbStat.fromJson(valueMap);
     }
     else {
       print("SOME WRONG CODE");
     }

  }).catchError( (e) {
    print(e);
    throw "jobStatusTotal error"; 
    } 
    
    );

    throw "jobStatusTotal error";
 
}

每次我运行它时,代码都会出错,我得到下一个结果: 在此处输入图像描述

我认为模型中可能存在问题,所以我尝试对值进行硬编码:

notificationsTotalCount: 123

但这无济于事。有任何想法吗?

标签: flutterdart

解决方案


你的方法jobStatusTotal实际上并没有返回任何东西。它只是触发您的then链条并继续引发异常。

我强烈建议您使用async/而不是await链接.then,因为这些错误更容易发现,因此更难制造。

这就是您的方法的样子:

Future<TotalDbStat> jobStatusTotal() async {
   const value = await http.get('http://127.0.0.1:5001/status?total');

   if(value.statusCode == 200) {
      Map<String, dynamic> valueMap = jsonDecode(value.body)['data'];
      return TotalDbStat.fromJson(valueMap);
   } else {
     print("SOME WRONG CODE");
     return null; // decide what to do here! Maybe throw something?
   }
}

推荐阅读