我正在尝试创建一个包含由 SharedPreferences 获取的值的列表。但是,如果我想使用 SharedPreference,我必须使用异步方法/ future 类型,但我不知道如何使用它们。我尝试遍历 sports
列表,但它是异步的/ future 的。那么我该如何迭代它(使用 map )?
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
return MaterialApp(
Center(
child: Align(
alignment: Alignment.bottomCenter,
child: CarouselSlider(
options: CarouselOptions(
height: 565,
aspectRatio: 16/9,
enlargeCenterPage: true,
viewportFraction: .8,
),
items: sportsList.map((i) {
return Builder(builder: (BuildContext context) {
return Container(
.......
.........
.......
}
static Future<bool> initSharedPreference(String key) async {
final SharedPreferences prefs = await SharedPreferences.getInstance();
return prefs.getBool(key) ?? false;
}
Future<List> sportsList() async {
List sports=[
await initSharedPreference("test")),
....,
....,
....
];
}
由于以下原因,此代码不起作用:
方法“map”没有为类型“Future”定义。
最佳答案
为什么会出现这个问题?
Future<List> sportsList() async {
List sports=[
await initSharedPreference("test")),
....,
....,
....
];
}
上面的代码不是一个简单的列表,这里可以直接渲染列表。它正在返回 Future<List>
必须作为后台工作获取。
所以使用 FutureBuilder
FutureBuilder 是一次性调用,在其生命周期内只会运行一次。所以您可以信赖它。
FutureBuilder(
future: sportsList(),
builder: (context, snapshot) {
if (!snapshot.hasData) {
return CircularProgressIndicator();
} else {
List<Widget> list = snapshot.data;
return CarouselSlider(
options: CarouselOptions(
height: 565,
aspectRatio: 16/9,
enlargeCenterPage: true,
viewportFraction: .8,
),
items: list.map(.....).toList(),
);
}
})
关于Flutter - 遍历异步/ future 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62933016/