Flutter 권한 요청

황인호·2022년 12월 24일
1

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('안녕'),
    );
  }
}
profile
성장중인 백엔드 개발자!!

0개의 댓글