Flutter/pakages

ํ”Œ๋Ÿฌํ„ฐ(Flutter) package_info_plus ํŒจํ‚ค์ง€๋กœ ์•ฑ ํŒจํ‚ค์ง€ ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ

Hac. Dog ๐ŸŒญ 2024. 2. 15. 13:24

 

pub.dev์—์„œ ํŒจํ‚ค์ง€ ์ข‹์€๊ฑฐ ์—†๋‚˜ ๋‘˜๋Ÿฌ๋ณด๋‹ค๊ฐ€ ์ƒ๊ฐ๋ณด๋‹ค ์ธ๊ธฐ๊ฐ€ ์žˆ์–ด๋ณด์ด๋Š” ์•ฑ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

 

 

ํŒจํ‚ค์ง€ ํ”Œ๋Ÿฌ์Šค..? ๊ฐ€ ๋ญ์ง€.... ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด์„œ ์‚ฌ์šฉ๋ฒ•์„ ์ฝ์–ด๋ณด๋Š”๋ฐ

๋ญ์ง€..? ๋” ๋ชจ๋ฅด๊ฒ ๋Š”๋ฐ

์ผ๋‹จ ์‚ฌ์šฉํ•ด๋ณธ๊ฒฐ๊ณผ ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์˜ ํŒจํ‚ค์ง€๊ด€๋ จ๋œ ๋‚ด์šฉ์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š” ํŒจํ‚ค์ง€์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

์‚ฌ์šฉ๋ฒ•์€ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

pubspec.yaml ํŒŒ์ผ์— ํŒจํ‚ค์ง€๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ 

// `PackageInfo.fromPlatform()`์ „์— ์ด ๋ผ์ธ์„ ํ˜ธ์ถœํ•˜์„ธ์š”
WidgetsFlutterBinding.ensureInitialized();

PackageInfo packageInfo = await PackageInfo.fromPlatform();

์œ„ ๋‘๊ฐœ๋ฅผ runApp() ์‹คํ–‰์ „์— ์‹คํ–‰์‹œ์ผœ ์ฃผ๊ณ 

String appName = packageInfo.appName;
String packageName = packageInfo.packageName;
String version = packageInfo.version;
String buildNumber = packageInfo.buildNumber;

์ด๋ ‡๊ฒŒ 4๊ฐœ์˜ ๋ณ€์ˆ˜์— ํŒจํ‚ค์ง€ ์ •๋ณด๋ฅผ ๋„ฃ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์‹คํ–‰ ๊ฒฐ๊ณผ

 

๋‹ค๋งŒ ์—ฌ๊ธฐ์„œ ๋ฌธ์ œ์ ์ด,

PackageInfo packageInfo = await PackageInfo.fromPlatform();

๋ฅผ ์–ธ์ œ ์ดˆ๊ธฐํ™” ํ•˜๋ƒ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.

์ € ๊ฐ™์€๊ฒฝ์šฐ๋Š” ๊ทธ๋ƒฅ runApp()์ „์— ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ดˆ๊ธฐํ™”๋ฅผ ์‹œ์ผœ๋ฒ„๋ ธ๋Š”๋ฐ

void main() async {
  // Be sure to add this line if `PackageInfo.fromPlatform()` is called before runApp()
  WidgetsFlutterBinding.ensureInitialized();
  PackageInfo packageInfo = await PackageInfo.fromPlatform();
  runApp(
    MaterialApp(
      home: MyApp(
        packageInfo: packageInfo,
      ),
    ),
  );
}

 

๊ณต์‹์—์„œ๋Š” ์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์€ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์˜ค๋ฅ˜๋ฅผ ์˜ˆ๊ธฐํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฐ€๋Šฅํ•œ ์ง€์–‘ ํ•˜๋ผ๊ณ  ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋ž˜์„œ ๊ฐ€๋Šฅํ•œ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” FutureBuilder๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

class _HomeScreenState extends State<HomeScreen> {
  Future<PackageInfo> _loadPackageInfo() async {
    return await PackageInfo.fromPlatform();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: FutureBuilder<PackageInfo>(
        future: _loadPackageInfo(),
        builder: (context, snapshot) {
          if (snapshot.connectionState == ConnectionState.waiting) {
            return const Center(child: CircularProgressIndicator());
          } else if (snapshot.hasError) {
            return const Center(child: Text("Error loading package info"));
          } else {
            // Successfully loaded PackageInfo
            final packageInfo = snapshot.data!;
            return Center(
              child: Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: [
                  Text('appName : ${packageInfo.appName}'),
                  Text('packageName : ${packageInfo.packageName}'),
                  Text('version : ${packageInfo.version}'),
                  Text('buildNumber : ${packageInfo.buildNumber}'),
                ],
              ),
            );
          }
        },
      ),
    );
  }
}

 

ํ™•์‹คํžˆ FutureBuilder๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ์ „์„ฑ์ด ๋ณด์žฅ๋˜๊ฒ ์ง€๋งŒ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ ์ธก๋ฉด์—์„œ๋Š” ์•ˆ์ข‹์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ณ ์ž‘ ํŒจํ‚ค์ง€๋ช…์„ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ์œ„ํ•ด์„œ ์ฝ”๋“œ๊ฐ€ ๊ธธ์–ด์ง„๋‹ค๋Š”๊ฒƒ์€ ์ข‹์€ ์ฝ”๋“œ๋Š” ์•„๋‹Œ ๋А๋‚Œ?

๋ฌดํŠผ ์ด๋กœ์จ package_info_plus ์‚ฌ์šฉ๋ฒ•์„ ์•Œ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค.

 

์•„์ง ์ด ํŒจํ‚ค์ง€๋ฅผ ์–ด๋””์— ์‚ฌ์šฉํ•ด์•ผ ํ• ์ง€ ๊ฐ์€ ์•ˆ์˜ค์ง€๋งŒ, ์ฃผ๋กœ ๋‚ด ์ •๋ณดํŽ˜์ด์ง€์— ์žˆ๋Š” "์•ฑ ๋ฒ„์ „"์— ์ ๊ฒŒ ๋œ๋‹ค๋ฉด

์œ ์šฉํ•œ ๊ธฐ๋Šฅ์ผ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด ํŒจํ‚ค์ง€๋ฅผ ์•ˆ์“ด๋‹ค๋ฉด ํ•˜๋“œ์ฝ”๋”ฉํ•ด์•ผํ•˜๋ฏ€๋กœ(ํ•˜๋“œ์ฝ”๋”ฉ์€ ๋ฉˆ์ถฐ!)

 

์ „์ฒด ์ฝ”๋“œ
์ฝ”๋“œ ๋ณด๊ธฐ
import 'package:flutter/material.dart';
import 'package:package_info_plus/package_info_plus.dart';

void main() {
  runApp(
    MaterialApp(
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        textTheme: const TextTheme(
          bodyMedium: TextStyle(
            fontSize: 14,
            height: 2,
          ),
        ),
      ),
      home: const HomeScreen(),
    ),
  );
}

class HomeScreen extends StatefulWidget {
  const HomeScreen({super.key});

  @override
  State<HomeScreen> createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  Future<PackageInfo> _loadPackageInfo() async {
    return await PackageInfo.fromPlatform();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: FutureBuilder<PackageInfo>(
        future: _loadPackageInfo(),
        builder: (context, snapshot) {
          if (snapshot.connectionState == ConnectionState.waiting) {
            return const Center(child: CircularProgressIndicator());
          } else if (snapshot.hasError) {
            return const Center(child: Text("Error loading package info"));
          } else {
            // Successfully loaded PackageInfo
            final packageInfo = snapshot.data!;
            return Center(
              child: Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: [
                  Text('appName : ${packageInfo.appName}'),
                  Text('packageName : ${packageInfo.packageName}'),
                  Text('version : ${packageInfo.version}'),
                  Text('buildNumber : ${packageInfo.buildNumber}'),
                ],
              ),
            );
          }
        },
      ),
    );
  }
}