如何在初始化时调用和 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";
});
}
}
我正在尝试从 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";
});
}
}