flutter futurebuilder
时间: 2023-05-03 16:00:35 浏览: 170
Flutter中的FutureBuilder是一个widget,用于在异步操作完成后构建UI。它需要传入一个Future对象,并根据Future的状态来构建UI。如果Future成功返回数据,它将在builder函数中构建widget来显示结果。如果Future在等待状态,它将显示加载指示器。如果Future失败,则显示错误信息。FutureBuilder非常有用,特别是在需要处理异步操作(如网络请求)时。
相关问题
flutter futurebuilder代码
下面是一个基本的Flutter FutureBuilder示例代码:
```
import 'package:flutter/material.dart';
class ExampleFutureBuilder extends StatefulWidget {
@override
_ExampleFutureBuilderState createState() => _ExampleFutureBuilderState();
}
class _ExampleFutureBuilderState extends State<ExampleFutureBuilder> {
// Future that simulates data loading
Future<String> _futureData() async {
await Future.delayed(Duration(seconds: 3));
return "Data returned from future!";
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("FutureBuilder Example"),
),
body: FutureBuilder<String>(
future: _futureData(),
builder: (BuildContext context, AsyncSnapshot<String> snapshot) {
switch (snapshot.connectionState) {
case ConnectionState.none:
return Text("No data yet.");
case ConnectionState.waiting:
return Center(child: CircularProgressIndicator());
case ConnectionState.active:
case ConnectionState.done:
if (snapshot.hasError) {
return Text("Error: ${snapshot.error}");
} else if (!snapshot.hasData) {
return Text("No data retrieved.");
} else {
return Center(child: Text(snapshot.data!));
}
}
},
),
);
}
}
```
这是一个简单的页面,它使用FutureBuilder小部件来获取和显示数据。它使用一个Future方法 `_futureData()` 来模拟加载数据,然后使用FutureBuilder小部件来侦听和显示Future。在 `builder` 函数中,它检查 `connectionState`,并根据需要返回不同的小部件。
如果 `connectionState` 是 `none`,它会返回 "No data yet.";如果是 `waiting`,它会返回一个旋转的进度指示器;如果是 `active` 或 `done`,则会检查 `hasError` 和 `hasData`。如果存在错误,则它会返回错误消息,否则它将返回数据。
flutter 封装 FutureBuilder 并且展示详细的使用方法
Flutter中的FutureBuilder是一种异步UI构建模式,它可以帮助我们在等待异步操作完成时展示一些占位符UI,等异步操作完成后再用数据替换掉占位符UI。在封装FutureBuilder时,我们可以创建一个可重用的Widget,使得我们在多个页面或多个地方都可以调用这个Widget来展示异步数据。
下面是一个简单的FutureBuilder封装Widget的例子:
```
import 'package:flutter/material.dart';
class FutureBuilderWidget<T> extends StatelessWidget {
final Future<T> future;
final Widget Function(BuildContext, T) builder;
final Widget Function(BuildContext, dynamic) errorBuilder;
final Widget waitingWidget;
const FutureBuilderWidget({
Key key,
this.future,
this.builder,
this.errorBuilder,
this.waitingWidget,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return FutureBuilder<T>(
future: future,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return waitingWidget ?? Center(child: CircularProgressIndicator());
} else if (snapshot.hasData) {
return builder(context, snapshot.data);
} else {
return errorBuilder != null
? errorBuilder(context, snapshot.error)
: Center(child: Text('Error: ${snapshot.error}'));
}
},
);
}
}
```
在这个封装Widget中,我们传入了一个future和一个builder函数,当future完成后,会把得到的数据传入builder函数中进行处理。同时,我们还可以传入一个errorBuilder和一个waitingWidget,分别用于处理异步操作出错和等待异步操作完成时的占位符UI。
下面是一个使用这个封装Widget的例子:
```
class MyHomePage extends StatelessWidget {
final Future<String> futureData = Future.delayed(Duration(seconds: 2), () => "Hello, FutureBuilder!");
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('FutureBuilder Example'),
),
body: FutureBuilderWidget<String>(
future: futureData,
waitingWidget: Center(child: CircularProgressIndicator()),
builder: (context, data) => Center(child: Text(data)),
errorBuilder: (context, error) => Center(child: Text('Error: $error')),
),
);
}
}
```
在这个例子中,我们定义了一个futureData,它会在2秒后返回一个字符串。在MyHomePage中,我们调用了FutureBuilderWidget,传入了futureData以及builder、errorBuilder和waitingWidget函数,分别定义了异步完成后的UI、异步失败后的UI和等待异步完成时的UI。运行这个例子后,我们会看到一个圆形进度条,等待2秒后,进度条消失,我们看到了异步操作完成后的字符串。如果异步操作出现了错误,我们也会看到一个错误提示。
阅读全文