[Flutter] flutter_oss_licenses

euni·2025년 4월 9일
0

Flutter

목록 보기
5/12

플러터에서 내가 사용한 오픈소스 라이센스를 손쉽게 보여주도록 지원해주는 패키지가 있다

flutter_oss_licenses


사용 방법

1. 의존성 추가

- pubspec.yaml에 아래 코드 추가

flutter_oss_licenses: ^3.0.4

2. json 파일 생성

  • flutter_oss_licenses 3.0.0 이후부터는 .json 출력만 지원하고,
    --text --markdown 옵션은 더 이상 지원해주지 않음

    run flutter_oss_licenses:generate -o assets/json/licenses.json --json

  • 내가 지정한 폴더 경로에 오픈소스 json 파일이 생성된다

3. 예시


json 파일 활용해서 자유롭게 화면 구현하기

1. pubspec.yaml 등록하기

flutter:
  uses-material-design: true
  assets:
    - assets/
    - assets/json/licenses.json

2. 화면 구현 예시

import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart' show rootBundle;
import 'package:marrying_flutter/app_theme.dart';

class SettingLicenses extends StatelessWidget {
  const SettingLicenses({super.key});

  Future<List<Map<String, dynamic>>> loadLicenses() async {
    final jsonString = await rootBundle.loadString('assets/json/licenses.json');
    final List<dynamic> jsonData = json.decode(jsonString);
    return jsonData.map((e) => e as Map<String, dynamic>).toList();
  }

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('오픈소스 라이센스')),
      body: FutureBuilder<List<Map<String, dynamic>>>(
        future: loadLicenses(),
        builder: (context, snapshot) {
          if (!snapshot.hasData) {
            return Center(
                child: CircularProgressIndicator(
              color: AppThemeColors().pink,
              strokeWidth: 2,
            ));
          }
          final licenses = snapshot.data!;

          return ListView.separated(
            padding: const EdgeInsets.all(16),
            itemCount: licenses.length,
            separatorBuilder: (_, __) => Divider(
              color: AppThemeColors().divider,
            ),
            itemBuilder: (context, index) {
              final license = licenses[index];
              final name = license['name'] ?? 'Unknown';
              final homepage = license['homepage'] ?? license['repository'];

              return ListTile(
                title: Text(
                  name,
                  style: TextStyle(fontSize: 15, fontWeight: AppThemeFontWeights().medium),
                ),
                subtitle: homepage != null
                    ? Text(
                        homepage,
                        style: TextStyle(color: AppThemeColors().grey73),
                      )
                    : null,
              );
            },
          );
        },
      ),
    );
  }
}
profile
플러터 개발자 👩🏻‍💻

0개의 댓글