개발자 랩실/플러터 (Flutter)

[Flutter] The expression has a type of ‘void’ so its value can’t be used.

sina.dev 2022. 2. 16. 10:00
728x90

 

에러 이유

  • VoidCallback 함수에 async / await 사용하려고 해서 에러가 남.
  • dart 버전 2.0.4 버전에서는 VoidCallback 메소드를 사용해도 정상적으로 사용이 됐지만 dart 2.12 버전부터는 AsyncCallback 메소드를 이용해야 한다.

 

에러 해결

  • AsyncCallback 함수를 이용해 async / await가 필요한 메소드에 사용해준다.
class OneButtonWidget extends StatefulWidget {
  final String text;
  final AsyncCallback onPressed;
  final EdgeInsets margin;
  final Color fillColor;
  final Color highlightColor;

  const OneButtonWidget({
    Key key,
    @required this.text,
    this.onPressed,
    this.margin,
    fillColor,
    highlightColor,
  })  : fillColor = fillColor ?? MyColors.tealish,
        highlightColor = highlightColor ?? MyColors.tealBlue,
        super(key: key);

  @override
  _OneButtonWidgetState createState() => _OneButtonWidgetState();
}

class _OneButtonWidgetState extends State<OneButtonWidget> {
  bool _isProgressing = false;

  @override
  Widget build(BuildContext context) {
    final hasOnPressed = widget.onPressed != null;
    return RawMaterialButton(
      elevation: 0,
      fillColor: hasOnPressed ? widget.fillColor : Theme.of(context).disabledColor,
      splashColor: Colors.transparent,
      highlightColor: widget.highlightColor,
      onPressed: hasOnPressed
          ? () async {
              if (_isProgressing) return; // onPressed 가 진행중일 때 멈춤
              _isProgressing = true;
              try {
                //onPressed 함수 실행이 완료될 때 까지 버튼 클릭 재진입을 방지하기 위해 await 를 붙임
                await widget.onPressed(); // ignore: await_only_futures
              } finally {
                _isProgressing = false;
              }
            }
          : null,
      child: Container(
        height: 48,
        alignment: Alignment.center,
        margin: widget.margin,
        child: Text(
          widget.text,
          style: TextStyle(
            color: hasOnPressed ? Colors.white : Theme.of(context).unselectedWidgetColor,
            fontWeight: FontWeight.w700,
            fontSize: 14.0,
          ),
        ),
      ),
    );
  }
}

 

AsyncCallback 메소드 설명

AsyncCallback typedef - foundation library - Dart API

 

VoidCallback과 AsyncCallback 비교

  • VoidCallback : 인수가 없고 데이터를 반환하지 않는 콜백
  • AsyncCallback : 인수가 없고 데이터를 반환하지 않지만 작업이 완료될 때 표시하기 위해 Future를 반환하는 콜백