ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Flutter]플러터(오픈 라이선스 자동출력) |안드로이드, IOS
    Flutter_끄적끄적 2022. 1. 8. 07:20

    앱을 배포 할때 특정 패키지들은 해당 앱에 사용된 패키지를 명시해야 할 때 가 있다.

    Flutter 패키지 중 해당 프로젝트에 사용된 패키지 오픈소스 라이선스를 자동 출력해주는 패키지가 있다.

    • 사용 패키지(pubspec.yaml 추가) 
      dev_dependencies:
        flutter_test:
          sdk: flutter
        flutter_oss_licenses: ^1.1.1
       *해당 패키지 설치는 dev_dependencies 밑에 명시 해줘야한다.

    • 해당 프로젝트 터미널창에 명령어 입력
      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 이동

     

    댓글

Devksr