【问题标题】:FutureBuilder not working as intended in flutterFutureBuilder 在颤动中无法按预期工作
【发布时间】:2019-10-07 16:13:56
【问题描述】:

我正在从这里获取 json:https://api.myjson.com/bins/1g3xpe,在我的颤振应用程序中。

这是代码(我已经删除了不相关的部分)。问题是,FutureBuilder 的构建器部分永远不会被调用。这条线debugPrint(snapshot.hasData.toString()); 永远不会被调用。

import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'package:nirmithi/objects/project.dart';
import 'dart:convert';

class Projects extends StatefulWidget {
  @override
  ProjectsState createState() => new ProjectsState();
}

class ProjectsState extends State<Projects> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      primary: true,
      appBar: EmptyAppBar(),
      body: Column(
        children: <Widget>[
          headerWidget(),
          Container(
            child: futureBuilder(),
          )
        ],
      ),
    );
  }

  @override
  void setState(fn) {
    super.setState(fn);
  }
}

Future<List<Project>> getData() async {
  String getProjects = "https://api.myjson.com/bins/1g3xpe";

  final response = await http.get(getProjects);

  if (response.statusCode == 200) {
    List responseJson = json.decode(response.body);
    return responseJson.map((m) => Project.fromJson(m)).toList();
  } else
    throw Exception(response.toString());
}

Widget futureBuilder() {
  FutureBuilder<List<Project>>(
    future: getData(),
    builder: (context, snapshot) {
      debugPrint(snapshot.hasData.toString());
    },
  );

  return Center(
    child: CircularProgressIndicator(),
  );
}


Widget listWidget(List<Project> data) {
  return ListView.builder(
    itemCount: data.length,
    itemBuilder: (BuildContext context, int index) {
      listItem(data.elementAt(index));
    },
  );
}

Widget listItem(Project project) {

  return Card(
    elevation: 6.0,
    child: Column(
      children: <Widget>[Text(project.projectId), Text(project.projectName)],
    ),
  );
}

class EmptyAppBar extends StatelessWidget implements PreferredSizeWidget {
  @override
  Widget build(BuildContext context) {
    return Container();
  }

  @override
  Size get preferredSize => Size(0.0, 0.0);
}

更新: 这是构建器部分中的代码,我删除以进行调试。

switch (snapshot.connectionState) {
        case ConnectionState.none:
        case ConnectionState.waiting:
          return new Text('loading...');
        default:
          if (snapshot.hasError)
            return new Text('Error: ${snapshot.error}');
          else
            return listWidget(snapshot.data);
      }

【问题讨论】:

  • 开个玩笑,你能帮我找出错误吗
  • 它永远不会被调用,因为它永远不会被任何其他内部/外部函数执行或调用。修复它会让它像魅力一样工作
  • 当 snapshot.hasData 为 null 时,给出 CircularProgressIndicator,否则部分放入您的代码。试试这个。
  • 你不会得到任何异常,因为不从构建器(你有 debugPrint 的地方)返回小部件应该会引发异常
  • 您是否遇到任何异常或错误?

标签: android flutter


【解决方案1】:

您需要返回您的 FutureBuilder,以便它成为小部件树的一部分:

Widget futureBuilder() {
  return FutureBuilder<List<Project>>(
    future: getData(),
    builder: (context, snapshot) {
      // ...
    },
  );
}

仅仅创建它的一个实例并不能解决未来问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-23
    • 2014-12-09
    相关资源
    最近更新 更多