flutter - 在 FutureBuilder 工作时从另一个 API 获得响应
问题描述
late Future<Kategori> _futureArticles;
late Future<Article> _futureSummary;
和 API 的
@override
void initState() {
_futureArticles = _newsService.getArticlesByCategory(widget.id);
_futureSummary = _newsService.getArticleById(widget.id);
super.initState();
}
和 FutureBuilder
child: FutureBuilder<Kategori>(
future: _futureArticles,
builder: (BuildContext context, AsyncSnapshot<Kategori> snapshot) {
if (snapshot.hasData) {
final articles = snapshot.data?.data;
现在有了 FutureArticles 和这种结构,一切正常,但我需要来自 _futureSummary 的另一个 json 值。两个 API 都有相同的 ID 值,所以我可以从第二个 API 获取 json.summary 值。但是怎么做?我尝试使用 future.wait 但它没有用。
同时,我在不同页面上使用第二个 APi 来获取特定新闻的所有信息。
什么是正确的方法?
解决方案
不确定您要达到的目标。您是否希望您的 Future 构建器仅在两个 Futures 都完成时重建?如果是这样 - 尝试结合两个期货。Future.wait 将等待您传递的所有 Future 对象完成,并返回结果列表:
让我用工作演示更新我的答案 - 你可以在 DartPad 中测试它。请注意,第一个 Future 将在 1 秒后完成(并将日志写入控制台),但 FutureBuilder 将等到第二个 Future 完成,然后才显示两者的值。
import 'package:flutter/material.dart';
const Color darkBlue = Color.fromARGB(255, 18, 32, 47);
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData.dark().copyWith(
scaffoldBackgroundColor: darkBlue,
),
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Center(
child: MyWidget(),
),
),
);
}
}
class MyWidget extends StatefulWidget {
@override
_MyWidgetState createState() => _MyWidgetState();
}
class _MyWidgetState extends State<MyWidget> {
late Future<String> _futureArticles;
late Future<int> _futureSummary;
@override
void initState() {
_futureArticles = Future.delayed(const Duration(seconds:1), () {print("First is done"); return "First is done";});
_futureSummary = Future.delayed(const Duration(seconds:5), () => 10);
super.initState();
}
@override
Widget build(BuildContext context) {
return FutureBuilder<List<dynamic>>(
future: Future.wait([_futureArticles, _futureSummary]),
builder: (BuildContext context, AsyncSnapshot<List<dynamic>> snapshot) {
if (snapshot.hasData) {
final articles = snapshot.data![0] as String;
final summary= snapshot.data![1] as int;
return Column(children:[
Text(articles),
Text('$summary')
]);
} else {
return const CircularProgressIndicator();
}
});
}
}
推荐阅读
- pdf - 无法在 WkWebView 中重新加载/重新显示 PDF;但RTF显然有效
- javascript - 触发事件处理程序时不挂钩useState?
- tensorflow - 训练 TF2 object_detection API 时张量板中的饱和对比度和低亮度
- javascript - 从javascript中的二进制文件中获取长数字
- javascript - 编写一个抛硬币并返回正面朝上的次数的函数?
- php - 使用简码显示为产品设置的 WooCommerce 产品标签名称
- python - How can I see a translation in my website
- sql - SQL 子查询和分组依据产生具有相同值的行
- flutter - 一旦我有响应,未来的建设者就不会更新
- node.js - 使用 Axios 和 Express 未定义响应