我是Ffltter和Dart的新手,我正在try 构建一款在屏幕上显示设备信息的Ffltter应用程序.为此,我try 使用此库:‘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;
}

Flutter相关问答推荐

Flutter 导致底部溢出

使用Flutter 提供程序包加载状态应用程序时,在自定义按钮中显示CircularProgressIndicator

DART 3.3:为什么扩展类型不起作用?

material 3芯片,不能go 除输入芯片小部件上的轮廓

遇到图像路径格式问题

如何使页面浏览量达到活动页面所要求的高度?

如何从RealmResults获取Flutter Flutter 流?

如何在Flutter 安全存储器中存储对象值?

为什么FloatingActionButton未显示

flatter_localizations错误在Null值上使用了Null判断运算符

Flutter 需要 Xcode 14 或更高版本

flutter Listview构建器溢出

使用 flutter_svg 在 flutter 中的 Canvas 上绘制 SVG 图像

更改底部导航栏下方 Flutter Snackbar 的位置

如何在 Flutter 中测试动画图标

Flutter - 根据从第一个 DropdownButtonForm 中 Select 的内容在第二个 DropdownButton 上显示选项

有没有办法为文本中的下划线创建自定义样式?

为什么 setState 不改变我的变量 Flutter?

如何在 SingleChildScrollView 小部件中管理自定义小部件状态

NoSuchMethodError:方法 '[]' 在 null 上被调用.我的信息流中的错误