gpt4 book ai didi

dart - 如何在 Widget 构建方法中调用异步属性

转载 作者:IT老高 更新时间:2023-10-28 12:39:15 26 4
gpt4 key购买 nike

我是 Flutter 和 Dart 的新手,我正在尝试构建一个在屏幕上显示设备信息的 Flutter 应用程序。为此,我试图从这里使用这个库:'device_info':https://pub.dartlang.org/packages/device_info#-readme-tab-

在 MyApp 类的“build”方法中,我试图从“device_info”包中实例化对象并调用一个恰好是异步属性的属性。由于默认的构建方法不是异步的,那么如何在构建方法中调用这个属性呢?以下是我的代码:

class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
DeviceInfoPlugin deviceInfoPlugin = DeviceInfoPlugin();
AndroidDeviceInfo androidDeviceInfo = await deviceInfoPlugin.androidInfo;
return MaterialApp(
title: 'My Device Info',
home: Scaffold(
appBar: AppBar(
title: Text('My Device Info'),
),
body: Center(
child: Text('Device model:' + 'Moto'),
),
),
);
}
}

最佳答案

我建议你使用 FutureBuilder:

import 'package:flutter/material.dart';

class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
// save in the state for caching!
DeviceInfoPlugin _deviceInfoPlugin;

@override
void initState() {
super.initState();
_deviceInfoPlugin = DeviceInfoPlugin();
}

@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'My Device Info',
home: Scaffold(
appBar: AppBar(
title: Text('My Device Info'),
),
body: FutureBuilder<AndroidDeviceInfo>(
future: _deviceInfoPlugin.androidInfo,
builder: (BuildContext context, AsyncSnapshot<AndroidDeviceInfo> snapshot) {
if (!snapshot.hasData) {
// while data is loading:
return Center(
child: CircularProgressIndicator(),
);
} else {
// data loaded:
final androidDeviceInfo = snapshot.data;
return Center(
child: Text('Android version: ${androidDeviceInfo.version}'),
);
}
},
),
),
);
}
}

通常,当使用 FutureBuilderFutures 时,您必须记住,封闭的小部件可以随时重建(例如,因为设备被旋转,或显示键盘)。这意味着再次调用 build 方法。

在这种特殊情况下,这不是问题,因为插件会缓存该值并立即返回它,但一般来说,您永远不应该在 build 中创建或获取 Future > 方法。相反,从 initState 或点击事件处理程序执行:

import 'package:flutter/material.dart';

class FooWidget extends StatefulWidget {
@override
_FooWidgetState createState() => _FooWidgetState();
}

class _FooWidgetState extends State<FooWidget> {
Future<int> _bar;

@override
void initState() {
super.initState();
_bar = doSomeLongRunningCalculation();
}

void _retry() {
setState(() {
_bar = doSomeLongRunningCalculation();
});
}

@override
Widget build(BuildContext context) {
return Column(
children: <Widget>[
FutureBuilder<int>(
future: _bar,
builder: (BuildContext context, AsyncSnapshot<int> snapshot) {
if (snapshot.hasData) {
return Text('The answer to everything is ${snapshot.data}');
} else {
return Text('Calculating answer...');
}
},
),
RaisedButton(
onPressed: _retry,
child: Text('Retry'),
)
],
);
}
}

Future<int> doSomeLongRunningCalculation() async {
await Future.delayed(Duration(seconds: 5)); // wait 5 sec
return 42;
}

关于dart - 如何在 Widget 构建方法中调用异步属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53800662/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com