개발자 랩실/플러터 (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를 반환하는 콜백