-
[Flutter]플러터(오픈 라이선스 자동출력) |안드로이드, IOSFlutter_끄적끄적 2022. 1. 8. 07:20반응형
앱을 배포 할때 특정 패키지들은 해당 앱에 사용된 패키지를 명시해야 할 때 가 있다.
Flutter 패키지 중 해당 프로젝트에 사용된 패키지 오픈소스 라이선스를 자동 출력해주는 패키지가 있다.
- 사용 패키지(pubspec.yaml 추가)
*해당 패키지 설치는 dev_dependencies 밑에 명시 해줘야한다.dev_dependencies: flutter_test: sdk: flutter flutter_oss_licenses: ^1.1.1
- 해당 프로젝트 터미널창에 명령어 입력
1. flutter pub get
2. flutter pub run flutter_oss_licenses:generate.dart
*2번째 명령어 까지 입력하면 해당 프로젝트의 최상위에 oss_licenses.dart 라는 파일이 자동 생성된다.
oss_licenses.dart 파일 안에는 현재 프로젝트에 사용되고 있는 모든 패키지의 licenses 정보를 Json 형태로 저장된다. - 생성된 oss_licenses.dart 편집
자동으로 생성된 oss_licenses.dart에는 명시에 불필요한 모든 패키지가 다 저장됨으로, 직접 편집을 해줘야한다.
pubspec.yaml에 입력한 패키지명을 대상으로 명시할 패키지만 남겨두고 모두 삭제 한다. - lib-> oss_licenses_page.dart 생성
import 'package:ai_mask_face/misc_oss_license_single.dart'; import 'package:flutter/material.dart'; import 'oss_licenses.dart'; class OssLicensesPage extends StatelessWidget { static Future<List<String>> loadLicenses() async { // merging non-dart based dependency list using LicenseRegistry. final ossKeys = ossLicenses.keys.toList(); return ossKeys..sort(); } static final _licenses = loadLicenses(); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text('Open Source Licenses'), ), body: FutureBuilder<List<String>>( future: _licenses, builder: (context, snapshot) { return ListView.separated( padding: const EdgeInsets.all(0), itemCount: snapshot.data?.length ?? 0, itemBuilder: (context, index) { final key = snapshot.data![index]; final licenseJson = ossLicenses[key]; final version = licenseJson['version']; final desc = licenseJson['description']; return ListTile( title: Text('$key ${version ?? ''}'), subtitle: desc != null ? Text(desc) : null, trailing: Icon(Icons.chevron_right), onTap: () => Navigator.of(context).push(MaterialPageRoute(builder: (context) => MiscOssLicenseSingle(name: key, json: licenseJson))) ); }, separatorBuilder: (context, index) => const Divider() ); } ) ); } }
lib-> misc_oss_license_single.dart 생성
import 'package:flutter/material.dart'; class MiscOssLicenseSingle extends StatelessWidget { final String name; final Map<String, dynamic> json; String get version => json['version']; String get description => json['description']; String get licenseText => json['license']; //String get homepage => json['homepage']; MiscOssLicenseSingle({required this.name, required this.json}); String _bodyText() { return licenseText.split('\n').map((line) { if (line.startsWith('//')) line = line.substring(2); line = line.trim(); return line; }).join('\n'); } @override Widget build(BuildContext context) { return Scaffold( body: Container( color: Theme.of(context).canvasColor, child: ListView(children: <Widget>[ if (description != null) Padding( padding: const EdgeInsets.only(top: 12.0, left: 12.0, right: 12.0), child: Text('${description}')), const Divider(), Padding( padding: const EdgeInsets.only(top: 12.0, left: 12.0, right: 12.0), child: Text( _bodyText(), style: Theme.of(context).textTheme.bodyText2 ), ), ]) ), ); } }
- main.dart에 라우터 등록
routes: { .... '/OpenLicenseIndex': (context) => OssLicensesPage(), },
다 끝났다 이제 특정 버튼을 만들어서 누르면 위에서 생성한 oss_licenses_page 를 보여주면된다.
TextButton(onPressed: (){ Navigator.pushNamed(context,'/OpenLicenseIndex'); }, child: Text('라이선스 페이지 버튼')),
버튼 누르면 oss_licenses_page 이동 반응형'Flutter_끄적끄적' 카테고리의 다른 글
[Flutter]플러터 flutter_local_notifications |안드로이드, IOS (4) 2022.03.13 [Flutter]플러터(Share - 공유)|안드로이드, IOS (0) 2022.02.22 [Flutter]플러터(Date Format)|안드로이드, IOS (0) 2021.12.15 [Flutter]플러터 버튼 클릭 시 진동 주기 |안드로이드, IOS (0) 2021.12.11 [Flutter]플러터 버튼 클릭 시 진동 주기 |안드로이드, IOS (0) 2021.12.01 - 사용 패키지(pubspec.yaml 추가)