Flutter/์ผ๋ฐ˜

ํ”Œ๋Ÿฌํ„ฐ[Flutter] GestureDetector ๋™์ž‘๋ฐฉ์‹๊ณผ ๋ Œ๋”๋ง ๋ฐ ํžˆํŠธ ํ…Œ์ŠคํŒ… ๋งค์ปค๋‹ˆ์ฆ˜ ํŒŒํ—ค์ณ๋ณด๊ธฐ

Hac. Dog ๐ŸŒญ 2024. 1. 24. 00:39

1. ๋ฌธ์ œ์˜ ๋ฐœ๋‹จ

๊ฐœ๋ฐœ์„ ํ•˜๋˜ ์ค‘์— ์œ„ ์‚ฌ์ง„์— ๋นจ๊ฐ„์ƒ‰ ๋ฐ•์Šค ๋ถ€๋ถ„, ์ฆ‰ ์ œํ’ˆ ๊ฒ€์ƒ‰ ๊ฐ€๋กœ ๋ถ€๋ถ„ ์ค‘ ์–ด๋””๋ฅผ ํด๋ฆญํ•ด๋„ GestureDetector๋ฅผ ํ†ตํ•ด

์ธ์‹์„ ํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

Row(
  children: [
    Expanded(
      child: GestureDetector(
        onTap: () {
          print('Clicked');
        },
        // ํ•œ ์˜์—ญ ๋ถ€๋ถ„ ์–ด๋””๋ฅผ ํด๋ฆญํ•ด๋„ ์ธ์‹๋˜๋„๋ก ์ปจํ…Œ์ด๋„ˆ๋กœ ๊ฐ์‹ธ๊ธฐ
        child: Container(
          child: const Row(
            children: [
              Icon(Icons.search, color: Colors.grey),
              SizedBox(width: 10),
              Text('์ œํ’ˆ ๊ฒ€์ƒ‰', style: TextStyle(color: Colors.grey)),
            ],
          ),
        ),
      ),
    ),
    ... [๊ทธ ์™ธ ์ฝ”๋“œ]
  ],
);

 

 

์ผ๋‹จ [ ์•„์ด์ฝ˜ - ํ…์ŠคํŠธ ] ๊ตฌ์กฐ์— Container๋ฅผ ๊ฐ์‹ธ์„œ ์ „์ฒด๊ฐ€ ์ธ์‹๋˜๋„๋ก ๊ตฌํ˜„ํ•˜์ž! ๋ผ๋Š” ์ƒ๊ฐ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ ์ธ์‹๋˜๋Š” ๋ถ€๋ถ„์€

์ด๋ ‡๊ฒŒ ์ž์‹์ด ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ๋„“์ด๋งŒํผ๋งŒ ์ธ์‹์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ width๋ฅผ double.infinity ๋ฅผ ํ•ด๋ณด๊ธฐ๋„ ํ•˜๊ณ  Row์— mainAxisSize๋ฅผ max๋กœ ์ฃผ์–ด๋„ ๊ฒฐ๊ตญ์€ ๋˜‘๊ฐ™์•˜์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์›์ธ์„ ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•ด Container๊ฐ€ ๋„ˆ๋น„๋ฅผ ์–ด๋А์ •๋„ ์ฐจ์ง€ํ•˜๋Š”์ง€ ์•Œ๊ธฐ ์œ„ํ•ด Color๋กœ ์ฒดํฌ๋ฅผ ํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

์•„๋‹ˆ ๋ญ์•ผ! ์ •์ƒ์ ์œผ๋กœ ๋„ˆ๋น„๋Š” ์ž˜ ๋จน๊ณ  ์žˆ์ž–์•„!

๊ทธ๋ž˜์„œ ๋‹ค์‹œ ํด๋ฆญ์„ ํ•ด๋ณด์•˜๋Š”๋ฐ ์ธ์‹์ด ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค....

์ฒ˜์Œ์—๋Š” ํ”„๋ ˆ์ž„์›Œํฌ ์˜ค๋ฅ˜์ธ์ค„ ์•Œ๊ณ  ๊ป๋‹ค ํ‚ค๊ณ  ๋‹ค์‹œ ๋ฐ˜๋ณตํ–ˆ๋Š”๋ฐ ์˜ค๋ฅ˜๋Š” ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์ปจ๋„ค์ด๋„ˆ์— ์ƒ‰์ƒ์ด ์—†์„๋•Œ / ์ƒ‰์ƒ์ด ์žˆ์„๋•Œ ์ธ์‹ ๋ถ€๋ถ„

๊ทธ๋ž˜์„œ ๋„๋Œ€์ฒด ์ƒ‰๊น”์„ ์ž…ํ˜€์•ผ๋งŒ ์™œ ๋„ˆ๋น„๋ฅผ ์ธ์‹ํ•˜๊ณ  GestureDetector๋„ ์ธ์‹์„ ํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ผ๊นŒ ์ฐพ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค.

 


๊ทธ๋ž˜์„œ ์ฐพ์•„๋ณธ ๊ฒฐ๊ณผ ๊ฒฐ๋ก ์ ์œผ๋กœ๋Š”

GestureDetector์˜ ๋™์ž‘๋ฐฉ์‹๊ณผ ์œ„์ ฏ์˜ ๋ Œ๋”๋ง ๋ฐ ํžˆํŠธ ํ…Œ์ŠคํŒ… ๋งค์ปค๋‹ˆ์ฆ˜๊ณผ ๊ด€๋ จ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

Flutter์—์„œ ์œ„์ ฏ์€ ๋ Œ๋”๋ง ํŠธ๋ฆฌ์— ์‹ค์ œ๋กœ ๊ทธ๋ ค์งˆ ๋•Œ๋งŒ ํžˆํŠธ ํ…Œ์ŠคํŠธ(์ฆ‰, ํ„ฐ์น˜ ์ด๋ฒคํŠธ)์— ์ฐธ์—ฌ ํ•œ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
์ฆ‰, Container์™€ ๊ฐ™์€ ์œ„์ ฏ์ด ํŠน์ •ํ•œ ํฌ๊ธฐ๋ฅผ ๋ฐฐ์ •๋ฐ›์ง€ ์•Š๊ณ  ๋ฐฐ๊ฒฝ์ƒ‰๋„ ์—†์„ ๊ฒฝ์šฐ์—๋Š”
Flutter ๋ Œ๋”๋ง ์—”์ง„ ์ž…์žฅ์—์„œ๋Š” ๊ทธ ์œ„์ ฏ์ด ์‹ค์ œ๋กœ ํ™”๋ฉด์— ํ‘œ์‹œ๋˜๋Š” ์˜์—ญ์ด ์—†๋‹ค๊ณ  ํŒ๋‹จํ•˜๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
(์ด ๋ถ€๋ถ„์€ ์•„๋งˆ๋„ ํ•„์š”์—†๋Š” ๋ฆฌ์†Œ์Šค ๋‚ญ๋น„๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค)
๋”ฐ๋ผ์„œ GestureDectector๊ฐ€ ๊ฐ์ง€ํ•˜๋Š” ์˜์—ญ๋„ ์‹ค์ œ๋กœ ์—†๋‹ค๊ณ  ๋œจ๋Š” ๊ฒƒ์ด๊ณ ์š”

 

์ผ๋‹จ ์›์ธ์€ ์•Œ์•˜์œผ๋‹ˆ ํ•ด๊ฒฐ๋ฒ•์„ ์•Œ์•„๋ด…์‹œ๋‹ค.

์ผ๋‹จ ๋ฐฐ๊ฒฝ์ƒ‰์„ ๋„ฃ์œผ๋ฉด ํ•ด๊ฒฐ๋˜๋Š” ๊ฒƒ ๊ฐ™๋„ค์š” ๊ทธ๋ ‡๋‹ค๊ณ  ๋‚ด๊ฐ€ ์ง€๊ธˆ ๋ฌด์Šจ ์ƒ‰์„ ๋„ฃ์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ๋„ ๋ฒˆ๊ฑฐ๋กœ์šฐ๋‹ˆ

color: Colors.transparent, // ํˆฌ๋ช…ํ•œ ๋ฐฐ๊ฒฝ์ƒ‰ ์ถ”๊ฐ€

์ด๋ ‡๊ฒŒ ๋„ฃ์œผ๋ฉด ๋ฌธ์ œ ํ•ด๊ฒฐ ์ž…๋‹ˆ๋‹ค.

 


 

Flutter๋ฅผ ๊ณต๋ถ€ํ•˜๋‹ค๋ณด๋ฉด UI๋ฅผ ๊ฐœ๋ฐœํ•˜๋‹ค๋ณด๋ฉด ์ƒˆ๋กญ๊ฒŒ ์•Œ์•„๊ฐ€๋Š” ์žฌ๋ฏธ๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‹จ์ˆœํžˆ ๊ทธ๋ฆผ ๊ทธ๋ฆฌ๋“ฏ์ด UI๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋ Œ๋”๋ง์— ์›๋ฆฌ๋ฅผ ์•Œ์•„๊ฐ€๋ฉฐ ๋ฐฐ์šฐ๋Š” ๊ฒƒ๋„ ์žฌ๋ฐŒ๋„ค์š”.

ํ˜น์‹œ ๊ถ๊ธˆํ•˜์‹  ์ ์ด๋‚˜ ์งˆ๋ฌธ ์žˆ์œผ๋ฉด ๋‹ต๋ณ€ ์ฃผ์„ธ์š”. ์ฝ์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

 

์ „์ฒด ์ฝ”๋“œ
์ฝ”๋“œ ๋ณด๊ธฐ
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';

class SearchProduct extends StatelessWidget {
  const SearchProduct({super.key});

  @override
  Widget build(BuildContext context) {
    return Row(
      children: [
        Expanded(
          child: GestureDetector(
            onTap: () {
              print('Clicked');
            },
            child: Container(
              // color: Colors.pink,
              child: const Row(
                mainAxisSize: MainAxisSize.max,
                children: [
                  Icon(Icons.search, color: Colors.grey),
                  SizedBox(width: 10),
                  Text('์ œํ’ˆ ๊ฒ€์ƒ‰', style: TextStyle(color: Colors.grey)),
                ],
              ),
            ),
          ),
        ),
        Container(
          height: 30,
          width: 1.0,
          color: Colors.black.withOpacity(0.3),
          margin: const EdgeInsets.symmetric(horizontal: 10.0),
        ),
        IconButton(
          onPressed: () {},
          icon: SvgPicture.asset('assets/icons/camera.svg'),
        ),
      ],
    );
  }
}