[Flutter] 화면 전체에서 아무 곳이나 누르면 이벤트 (주로 애니메이션)를 실행하는 방법
매번 매번 다시 조사하고 있다고 생각하기 때문에 썼습니다.
하고 싶은 일
왼쪽과 같은 버튼을 눌러 일어나는 이벤트를 오른쪽과 같이 화면의 아무 곳이나 탭해도 할 수 있도록 합니다.
소스 코드
버튼으로 이벤트 발화하는 소스 코드
fade_in_with_button.dartimport 'package:flutter/material.dart';
class FadeInPage extends StatefulWidget {
@override
_FadeInPageState createState() => _FadeInPageState();
}
// The State class is responsible for two things: holding some data we can
// update and building the UI using that data.
class _FadeInPageState extends State<FadeInPage> {
bool _visible = true;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title:Text("Fade in / Fade out by toggle button"),
),
body: Center(
child: AnimatedOpacity(
// If the Widget should be visible, animate to 1.0 (fully visible). If
// the Widget should be hidden, animate to 0.0 (invisible).
opacity: _visible ? 1.0 : 0.0,
duration: Duration(milliseconds: 500),
// The green box needs to be the child of the AnimatedOpacity
child: Container(
width: 200.0,
height: 200.0,
color: Colors.green,
),
),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
// Make sure we call setState! This will tell Flutter to rebuild the
// UI with our changes!
setState(() {
_visible = !_visible;
});
},
tooltip: 'Toggle Opacity',
child: Icon(Icons.flip),
), // This trailing comma makes auto-formatting nicer for build methods.
);
}
}
floatingActionButton
내에 onPressed
이벤트를 정의하여 이벤트를 실행할 수 있습니다.
여기에서는 _visible
의 토글을 실시하고 있습니다.
화면 전체의 아무 곳이나 눌러도 이벤트 발화하는 샘플 코드
fade_in_whole_screen.dartimport 'package:flutter/material.dart';
class FadeInPage extends StatefulWidget {
@override
_FadeInPageState createState() => _FadeInPageState();
}
// The State class is responsible for two things: holding some data we can
// update and building the UI using that data.
class _FadeInPageState extends State<FadeInPage> {
// Whether the green box should be visible or invisible
bool _visible = true;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Fade in / Fade out by whole screen"),
),
body: GestureDetector(
behavior: HitTestBehavior.opaque,
child: Center(
child: AnimatedOpacity(
// If the Widget should be visible, animate to 1.0 (fully visible). If
// the Widget should be hidden, animate to 0.0 (invisible).
opacity: _visible ? 1.0 : 0.0,
duration: Duration(milliseconds: 500),
// The green box needs to be the child of the AnimatedOpacity
child: Container(
width: 200.0,
height: 200.0,
color: Colors.green,
),
),
),
onTap: () {
setState(() {
_visible = !_visible;
});
}));
}
}
body
부분 전체를 GestureDetector
로 둘러싸고, 이전의 소스 코드내의 onPressed
에 정의되고 있던 내용을 onTap
에 기재합니다.
간이 되는 것이 behavior: HitTestBehavior.opaque
라는 부분입니다.
이 항목을 지정하지 않으면 GestureDetector
의 기본 behavior
가 사용되지만 기본적으로 behavior: HitTestBehavior.deferToChild
입니다.
이 디폴트 거동은, 아이 요소가 탭 되었을 때에 이벤트를 발화시키는 것이므로, 디폴트에서는 화면 전체를 탭해도 이벤트 발화는 하지 않습니다. (화면의 녹색 사각형 부분을 탭하면 이벤트 발화합니다.)
전체 소스 코드는 여기에 있습니다.
참고문헌
import 'package:flutter/material.dart';
class FadeInPage extends StatefulWidget {
@override
_FadeInPageState createState() => _FadeInPageState();
}
// The State class is responsible for two things: holding some data we can
// update and building the UI using that data.
class _FadeInPageState extends State<FadeInPage> {
bool _visible = true;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title:Text("Fade in / Fade out by toggle button"),
),
body: Center(
child: AnimatedOpacity(
// If the Widget should be visible, animate to 1.0 (fully visible). If
// the Widget should be hidden, animate to 0.0 (invisible).
opacity: _visible ? 1.0 : 0.0,
duration: Duration(milliseconds: 500),
// The green box needs to be the child of the AnimatedOpacity
child: Container(
width: 200.0,
height: 200.0,
color: Colors.green,
),
),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
// Make sure we call setState! This will tell Flutter to rebuild the
// UI with our changes!
setState(() {
_visible = !_visible;
});
},
tooltip: 'Toggle Opacity',
child: Icon(Icons.flip),
), // This trailing comma makes auto-formatting nicer for build methods.
);
}
}
import 'package:flutter/material.dart';
class FadeInPage extends StatefulWidget {
@override
_FadeInPageState createState() => _FadeInPageState();
}
// The State class is responsible for two things: holding some data we can
// update and building the UI using that data.
class _FadeInPageState extends State<FadeInPage> {
// Whether the green box should be visible or invisible
bool _visible = true;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Fade in / Fade out by whole screen"),
),
body: GestureDetector(
behavior: HitTestBehavior.opaque,
child: Center(
child: AnimatedOpacity(
// If the Widget should be visible, animate to 1.0 (fully visible). If
// the Widget should be hidden, animate to 0.0 (invisible).
opacity: _visible ? 1.0 : 0.0,
duration: Duration(milliseconds: 500),
// The green box needs to be the child of the AnimatedOpacity
child: Container(
width: 200.0,
height: 200.0,
color: Colors.green,
),
),
),
onTap: () {
setState(() {
_visible = !_visible;
});
}));
}
}
Reference
이 문제에 관하여([Flutter] 화면 전체에서 아무 곳이나 누르면 이벤트 (주로 애니메이션)를 실행하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/tez/items/556165a3706d691a96dd텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)