使用FutureBuilder时flutter discussed_futures

70gysomp  于 2023-06-30  发布在  Flutter
关注(0)|答案(1)|浏览(113)

我觉得linter规则discarded_future有问题
有没有一种方法可以使用discarded_future lint规则,而不必在每次使用FutureBuilder时忽略该规则。使用简单的FutureBuilder时触发规则正常吗?如果是,正确的方法是什么?

FutureBuilder<void>(
            
    future: retrieveLostData(),
    builder: (
      BuildContext context,
      AsyncSnapshot<void> snapshot,
    ) {
      switch (snapshot.connectionState) {
        case ConnectionState.none:
          return buildRowIconPhoto();
        case ConnectionState.waiting:
          return buildRowIconPhoto();
        case ConnectionState.done:
          return buildRowIconPhoto();
        default:
          return buildRowIconPhoto();
      }
    },
)
Future<void> retrieveLostData() async {
    LostDataResponse response = await _imagePicker.retrieveLostData();
    if (response.isEmpty) {
      return;
    }
    if (response.file != null && widget.onPhotoTaken != null) {
      widget.onPhotoTaken!(
        File(response.file!.path),
        false,
      );
    }
  }
s8vozzvw

s8vozzvw1#

我完全同意你的看法。我不明白为什么这个linter警告关心future属性是否接受同步未来或异步未来。
然而,这是你如何绕过警告的方法:

class _SomeClassState extends State<SomeClass> {
  Future<void> retrieveLostData() async {
    LostDataResponse response = await _imagePicker.retrieveLostData();
    if (response.isEmpty) {
      return;
    }
    if (response.file != null && widget.onPhotoTaken != null) {
      widget.onPhotoTaken!(
        File(response.file!.path),
        false,
      );
    }
  }

  Future<void> retrieveLostDataFuture() async {
    _lostDataFuture = retrieveLostData();
  }

  late final Future<void> _lostDataFuture;

  @override
  void initState() {
    super.initState();
    unawaited(retrieveLostDataFuture());
  }

  @override
  Widget build(BuildContext context) {
    return FutureBuilder<void>(
      future: _lostDataFuture,
      builder: (
        BuildContext context,
        AsyncSnapshot<void> snapshot,
      ) {
        switch (snapshot.connectionState) {
          case ConnectionState.none:
            return buildRowIconPhoto();
          case ConnectionState.waiting:
            return buildRowIconPhoto();
          case ConnectionState.done:
            return buildRowIconPhoto();
          default:
            return buildRowIconPhoto();
        }
      },
    );
  }
}

或者,如果你没有使用StatefulWidget,而不是在initState中调用retrieveLostDataFuture,你可以在构造函数中做同样的事情:

class SomeClass extends StatelessWidget {
  SomeClass() {
    unawaited(retrieveLostDataFuture());
  }
}

我认为这两种变体都非常丑陋,而您的原始代码可能是最好的版本。
这段代码是为那些对解决linter警告非常迂腐的人提供的。

相关问题