如何在初始化时调用和 API 端点。值仍然为空

How to call and API endpoint on initialize. Value is still null

我正在尝试从 API 获取用户信息。为此,我创建了一个用户对象。我想调用该函数并将其存储在用户中。但问题是,我不能使用 await 等到所有数据都在那里。

因此,我没有使用 async 和 await,而是尝试使用 .then 并用数据填充 userInfo。但是现在没有显示电子邮件值。它正在显示 'loading...'。

如果我使用 Future,我将无法做到 user.email。

是不是用FutureBuilder比较好?或者尝试使用 Async 和 Await(调用需要 2.5 秒)

这是代码

class Addressbook extends StatefulWidget {
  const Addressbook({Key? key}) : super(key: key);

  @override
  State<Addressbook> createState() => _AddressbookState();
}

class _AddressbookState extends State<Addressbook> {
  User? userInfo;
  Future<User> getUserInformation() async {
    User user = await UserService().getUserById(12345);
    return user;
  }

  @override
  void initState() {
    // TODO: implement initState
    getUserInformation().then((response) {
      userInfo = response;
    });
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Mijn adresboek'),
        centerTitle: true,
        elevation: 0.5,
        titleTextStyle: const TextStyle(
          fontSize: 21,
          color: Colors.black,
          fontWeight: FontWeight.bold,
        ),
      ),
      body: Text(userInfo?.email ?? "loading..."),

    );
  }
}

我要归档什么?

我想在屏幕上显示用户数据。在这种情况下,我想显示电子邮件。

有什么问题?

用户在初始化时没有填充数据(可能是因为它仍在加载以获取数据)。

我的问题

我该如何解决这个问题?异步等待解决方案还是我应该使用 FutureBuilder?你能给我一个工作样品吗?

感谢您的帮助!

你可以使用futurebuilder或者你可以在initstate中使用来获取api

  @override
  void initState() {
    // TODO: implement initState
    Future.delayed(Duration(seconds: 10), () {
      setState(() {
        userinfo = "response";
      });
      // userinfo = "response";

    });
    super.initState();
  }

小部件内部

Text(userinfo != null ? userinfo.toString() : "loading..."),

示例代码

import 'package:flutter/material.dart';
//import 'package:pucon/home.dart';

void main() => runApp(MyApp());

class MyApp extends StatefulWidget {
  MyApp({Key? key}) : super(key: key);

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String? userinfo = null;
  String? userinfo2 = null;

  @override
  void initState() {
    // TODO: implement initState
    Future.delayed(Duration(seconds: 10), () {
      setState(() {
        userinfo = "response";
      });
      // userinfo = "response";
    });
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: ListView(
        shrinkWrap: true,
        children: [
          Text(""),
          Text(""),
          Text(userinfo != null ? userinfo.toString() : "loading..."),
          Row(
            children: [
              FutureBuilder(
                builder: (context, snapshot) {
                  if (snapshot.connectionState == ConnectionState.done) {
                    return Container(
                        child: Text(userinfo2.toString()), );
                  } else {
                    return SizedBox(
                      child: CircularProgressIndicator(),
                      height: 45,
                      width: 45,
                    );
                    // else
                    //   return Container(
                    //     child: CircularProgressIndicator(),
                    //     height: 45,
                    //     width: 45,
                    //   );
                  }
                },
                future: _future(),
              ),
            ],
          )
          // InsertData(),
        ],
      ),
    );
  }

  _future() async {
   await Future.delayed(Duration(seconds: 5), () {
     userinfo2 = "Completed";
      // setState(() {
      //
      // });
      // userinfo = "response";
    });
  }
}