어떠한 행동을 하고 결과를 나한테 넘겨주는 것
함수의 선언과 호출
선언(정의) : 함수 만들기
호출 : 함수 실행void(리턴값 지정 ex)Stinrg,int 등) 함수명(){ 코드 블록 //실행할 내용 }
void 함수: 반환 안해. return 불필요, 실행만 하고 결과 안줘
int 함수 : int 형 데이터를 결과로 내줌, return DataType맞춰서 필요함!
String, List, bool 등등 돌려주는 return의 형태에 맞춰 작성해야함
void 예시(return이 필요없는 함수)
void printmsg(){ print("안녕"); print("hi"); } void main(){ printmsg(); //함수 실행 }
결과 -> 안녕 hi
- 함수는 특수한 임무를 가지고 있게 만들기
- 미리 정의 해놓으면 호출만 하면되는 간편함
- 독립적인 메모리 공간 사용 -> 함수안의 변수를 main에서 못 사용하잖아
- 함수에 데이터 전달 가능(매개변수), 매개변수의 개수 맞춰주기
함수를 호출할 때 전달해 줄 내용! 정의 부분에서 개수와 데이터형태 맞춰줘야 함
void printmsg(String yourName){ //매개변수로는 String형태만, //받아온 yoon이라는 String가짐 print("안녕"+yourname); } void main(){ printmsg("yoon"); //함수 실행, yoon이라는 String을 가지고 호출 }
결과 -> 안녕yoon
print("원하는 텍스트 $변수명 ");
일반적으로 버튼으로 끝나는 TextButton, FloatingActionButton 등은
onPressed 속성을 이용하여 핸들러와 연결이 가능하다.
그렇다면 Text나 Container 같은 일반 위젯에 이벤트 핸들러를 연결하는 방법은?
일반 위젯에 이벤트 핸들러를 연결할 수 있도록 해주는 위젯
자식으로 설정된 위젯을 누르면 잉크가 퍼져나가는 효과가 제공InkWell( onTap: () {}, child: Text("내용"), ),
결과 -> 내용이라 써있는 텍스트를 클릭하면 onTap의 {}안에 해당 함수의 실행 내용이 실행됨
InkWell보다 더 많은 제스쳐 감지 가능
GestureDetector(
onTap(){
print("hi");
}
child:Text("내용"),
)
->결과 : 텍스트를 누를 때 잉크가 퍼지진 않지만 터미널에 hi가 출력
main.dart
import 'package:contact_app/ContactTile.dart'; import 'package:contact_app/DrinkTile.dart'; import 'package:flutter/material.dart'; void main() { runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( bottomSheet: Container( color: Colors.black87, height: 64, child: Padding( padding: const EdgeInsets.symmetric(horizontal: 16), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( "주문할 매장을 선택해주세요.", style: TextStyle(color: Colors.white), ), Icon( Icons.expand_more, color: Colors.white, ) ], ), ), ), bottomNavigationBar: BottomNavigationBar( selectedItemColor: Colors.green, unselectedItemColor: Colors.grey, type: BottomNavigationBarType.fixed, items: [ BottomNavigationBarItem(icon: Icon(Icons.home), label: '홈'), BottomNavigationBarItem( icon: Icon(Icons.credit_card), label: 'pay'), BottomNavigationBarItem( icon: Icon(Icons.local_cafe), label: 'order'), BottomNavigationBarItem(icon: Icon(Icons.shop), label: 'shop'), BottomNavigationBarItem( icon: Icon(Icons.more_horiz), label: 'other'), ]), appBar: AppBar( iconTheme: IconThemeData( color: Colors.black, //색변경 ), backgroundColor: Colors.white, leading: Padding( padding: const EdgeInsets.all(8.0), child: Icon(Icons.navigate_before), ), elevation: 0, centerTitle: false, actions: [ Padding( padding: const EdgeInsets.all(8.0), child: Icon(Icons.search), ), ], ), body: ListView( children: [ Padding( padding: const EdgeInsets.all(8.0), child: Text( "NEW", style: TextStyle(fontSize: 42), ), ), DrinkTile( menuKr: '골든 미모사 그린 티', menuEn: 'Golden Mimosa Green Tea', price: '6100원', imgUrl: 'assets/images/item_drink1.jpeg', ), DrinkTile( menuKr: '블랙 햅쌀 고봉 라떼', menuEn: 'Black Rice Latte', price: '6300원', imgUrl: 'assets/images/item_drink2.jpeg', ), DrinkTile( menuKr: '아이스 블랙 햅쌀 고봉 라떼', menuEn: 'Iced Black Rice Latte', price: '6300원', imgUrl: 'assets/images/item_drink3.jpeg', ), DrinkTile( menuKr: '스타벅스 튜메릭 라떼', menuEn: 'Starbucks Turmeric Latte', price: '6100원', imgUrl: 'assets/images/item_drink4.jpeg', ), DrinkTile( menuKr: '아이스 스타벅스 튜메릭 라떼', menuEn: 'Iced Starbucks Turmeric Latte', price: '6100원', imgUrl: 'assets/images/item_drink5.jpeg', ), ], ), ), ); } }
DrinkTile.dart
import 'package:flutter/material.dart'; import 'package:flutter/src/widgets/container.dart'; import 'package:flutter/src/widgets/framework.dart'; class DrinkTile extends StatelessWidget { const DrinkTile( {super.key, required this.MenuKr, required this.MenuEn, required this.Price, required this.ImgUrl}); final String MenuKr; final String MenuEn; final String Price; final String ImgUrl; @override Widget build(BuildContext context) { return Padding( padding: const EdgeInsets.all(8.0), child: Row( children: [ CircleAvatar( backgroundImage: AssetImage(ImgUrl), radius: 48, ), Padding( padding: const EdgeInsets.all(8.0), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text(MenuKr), Text( MenuEn, style: TextStyle( fontSize: 14, fontWeight: FontWeight.w200, color: Colors.grey), ), Text(Price), ], ), ) ], ), ); } }