Flutter
자바스크립트에서 많이쓰이는 문법이다.
Dart에서도 사용할수있다.
Dart는 오래걸리는 줄을 제껴두고 다음 줄을 실행하려고하는 특징이있다
그런데 await 를 사용하면 다음줄로 넘어가지않고 실행될때까지 기다려준다~
initState({}) 는 안에 적은 코드는 위젯이 로드될때 한번 실행되는 특징을가지고있다.
Vue의 mounted와 비슷한거같다.
그리고 오늘은 유저에게 앱 권한을 요청하는 내용을 작성해보았다
사용한 라이브러리 => permission_handler: ^8.3.0
import 'package:flutter/material.dart';
import 'package:permission_handler/permission_handler.dart';
void main() {
// 앱을 구동시켜달라는 뜻
runApp(
MaterialApp(
home: MyApp(),
),
);
}
class MyApp extends StatefulWidget {
MyApp({super.key});
@override
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
// 패키지 만든 사람이 정한 사용법임!
getPermission() async {
// 이렇게 적으면 연락처 권한줬는지 상태확인가능함
var status = await Permission.contacts.status;
if (status.isGranted) {
print('허락됨');
} else {
print('거절됨');
// 팝업창 띄워주세요 하는 코드이다 연락처권한달라고....
Permission.contacts.request();
// 앱 설정화면을 켜줌 => 거절버튼을 누르면 다시는 안뜨기 떄문에
// 유저가 앱설정 들어가서 직접 권한을 허용할수있게끔하는 코드이다.
openAppSettings();
}
}
// @override
// void initState() {
// super.initState();
// // 앱이 로드될때 실행되게끔함!
// getPermission();
// }
var total = 3;
var name = ['김영수', '홍길동', '피자집'];
var like = [0, 0, 0];
//Dart 에서 함수만드는 방법
addOne() {
setState(() {
total++;
});
}
addText(a) {
setState(() {
name.add(a);
});
}
addDelete(a) {
setState(() {
name.remove(a);
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
floatingActionButton: FloatingActionButton(
onPressed: () {
// 진짜 부모위젯이 MaterialApp 인지 확인하는 방법!
print(context.findAncestorWidgetOfExactType<MaterialApp>());
showDialog(
context: context,
builder: (BuildContext context) {
return Modal(
addOne: addOne,
addText: addText,
);
},
);
},
),
appBar: AppBar(
title: Text(
total.toString(),
),
actions: [
IconButton(
onPressed: () {
getPermission();
},
icon: Icon(Icons.contacts))
],
),
body: ListView.builder(
// 얼마나 반복할건지?
itemCount: name.length,
// c = context
// i = 위젯이 반복생성될때마다 +1 되는 정수
itemBuilder: (c, i) {
print(i);
return ListTile(
leading: Icon(Icons.account_circle),
title: Text(name[i]),
trailing: ElevatedButton(
onPressed: () {
addDelete(name[i]);
},
child: Text('삭제')),
);
},
),
bottomNavigationBar: HomeWorkWidget2(),
);
}
}
class Modal extends StatelessWidget {
final name;
final addOne;
final addText;
var inputData = TextEditingController();
Modal({this.addOne, this.name, this.addText, Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return AlertDialog(
title: Text('Contact'),
content: TextField(
controller: inputData,
decoration: InputDecoration(),
),
actions: [
TextButton(
onPressed: () {
Navigator.of(context).pop();
},
child: Text(
'Cancle',
),
),
TextButton(
onPressed: () {
// addOne();
// print(inputData);
if (inputData.text != '') {
addText(inputData.text);
Navigator.of(context).pop();
}
},
child: Text(
'완료',
),
),
],
);
}
}
class HomeWorkWidget extends StatelessWidget {
const HomeWorkWidget({super.key});
@override
Widget build(BuildContext context) {
return Column(
children: [
Row(
children: [Icon(Icons.account_circle), Text('홍길동')],
),
],
);
}
}
class HomeWorkWidget2 extends StatelessWidget {
const HomeWorkWidget2({super.key});
@override
Widget build(BuildContext context) {
return BottomAppBar(
child: SizedBox(
height: 70,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
Icon(Icons.phone),
Icon(Icons.message),
Icon(Icons.contact_page),
],
),
),
);
}
}
class ShopItem extends StatelessWidget {
const ShopItem({super.key});
@override
Widget build(BuildContext context) {
return SizedBox(
child: Text('안녕'),
);
}
}