使用FutureBuilder时颤动discarded_futures

Hed*_*win 7 flutter flutter-futurebuilder flutter-lints

我觉得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();
      }
    },
)
Run Code Online (Sandbox Code Playgroud)
 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,
      );
    }
  }
Run Code Online (Sandbox Code Playgroud)

Vad*_*dim 1

我完全同意你的看法。我不明白为什么这个 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();
        }
      },
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

或者,如果您不使用 a StatefulWidget,则可以在构造函数中执行相同的操作,而不是调用retrieveLostDataFuturein :initState

class SomeClass extends StatelessWidget {
  SomeClass() {
    unawaited(retrieveLostDataFuture());
  }
}
Run Code Online (Sandbox Code Playgroud)

我认为,这两种变体都非常丑陋,而您的原始代码可能是最好使用的版本。

这段代码是为那些对解决 linter 警告非常迂腐的人提供的。