【问题标题】:setState(() {}); Required in Android FluttersetState(() {});在 Android Flutter 中需要
【发布时间】:2019-08-22 07:21:26
【问题描述】:

使用image_picker: ^0.6.0+15包选择图像后,我们在Android和iOS中收到了一个文件,但问题在于图像在UI中的显示/渲染。

//Display Image to user
          Expanded(
            child: Padding(
              padding: EdgeInsets.only(top: 20, bottom: 20),
              child: _selectedImage == null
                  ? Center(
                      child: Container(
                        child: Text('No Image selected'),
                      ),
                    )
                  : Image.memory(
                      _selectedImage.readAsBytesSync(),
                      fit: BoxFit.contain,
                    ),
            ),
          )

setState(() {}); 在 Android 中是必需的,但在 iOS 图像显示上没有调用 setState(() {}); 如果我们调用 setState(),iOS 上的 UI 会出现故障。

我们有一个选择:

Future getImage(int sourceType) async {
    _selectedImage = await ImagePicker.pickImage(
      source: sourceType == 1 ? ImageSource.gallery : ImageSource.camera,
      maxHeight: 500,
      maxWidth: 500,
    );
    // to show Images in Images  View
    if (Platform.isAndroid) {
      setState(() {});
    }
  }

但是iOS上不需要setState()有什么解释吗?

【问题讨论】:

    标签: flutter dart dart-pub


    【解决方案1】:

    任何接口都应该准备好每秒多次调用build()。您应该可以随时致电setState(),无需预约。当这是一个问题时,你做错了什么。

    我认为这就是你的问题所在:你在build() 中调用_selectedImage.readAsBytesSync()。您应该在其他地方执行此操作,并将有关它的信息保存在您的类的字段中,build() 函数使用这些字段简单地将这些信息转换为 UI。

    【讨论】:

    • 根据我的经验,当 _selectedImage 不为空时,此 (_selectedImage.readAsBytesSync()) 将被执行。
    • 你应该这样做并不好。由于你的构建函数有这样的副作用,你会遇到各种各样的问题。
    • 这段代码没有问题,它运行良好。我的观点是为什么我应该为 android 调用 setState() 但在 iOS 图像显示上而不调用 setState(() {});
    猜你喜欢
    • 2021-07-06
    • 1970-01-01
    • 2019-01-19
    • 1970-01-01
    • 2022-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-07
    相关资源
    最近更新 更多