flutter_app_info 3.0.3 copy "flutter_app_info: ^3.0.3" to clipboard
flutter_app_info: ^3.0.3 copied to clipboard

Utility package to easily access device, platform, target, package, and app version information

example/lib/main.dart

import 'dart:convert';

import 'package:flutter/material.dart';
import 'package:flutter_app_info/flutter_app_info.dart';

// ==========================================
// MAIN
// ==========================================

void main() async {
  runApp(
    AppInfo(
      data: await AppInfoData.get(),
      child: const MyApp(),
    ),
  );
}

// ==========================================
// CLASS: MyApp
// ==========================================

class MyApp extends StatelessWidget {
  const MyApp({super.key});
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter App Info',
      debugShowCheckedModeBanner: false,
      theme: ThemeData.light().copyWith(
        splashColor: Colors.transparent,
        splashFactory: NoSplash.splashFactory,
      ),
      home: const FlutterAppInfoExample(),
    );
  }
}

// ==========================================
// CLASS: FlutterAppInfoExample
// ==========================================

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

  @override
  State<FlutterAppInfoExample> createState() => _FlutterAppInfoExampleState();
}

class _FlutterAppInfoExampleState extends State<FlutterAppInfoExample>
    with SingleTickerProviderStateMixin {
  late final controller = TabController(vsync: this, length: 3);
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        children: [
          Material(
            color: const Color(0xff2a416f),
            child: TabBar(
              controller: controller,
              labelColor: Colors.white,
              unselectedLabelColor: Colors.grey.shade300,
              indicatorColor: Colors.white,
              indicatorWeight: 4,
              indicatorPadding: const EdgeInsets.only(bottom: 2),
              overlayColor: WidgetStateColor.resolveWith((states) {
                if (states.contains(WidgetState.hovered)) {
                  return Colors.white24;
                } else {
                  return Colors.transparent;
                }
              }),
              tabs: [
                const Text('Package Info'),
                const Text('Platform Info'),
                const Text('Target Info'),
              ]
                  .map((e) => Padding(
                        padding: const EdgeInsets.symmetric(vertical: 12),
                        child: e,
                      ),)
                  .toList(),
            ),
          ),
          Expanded(
            child: TabBarView(
              controller: controller,
              children: const [
                PackageInfoTab(),
                PlatformInfoTab(),
                TargetInfoTab(),
              ],
            ),
          ),
        ],
      ),
    );
  }
}

// ==========================================
// CLASS: Prop
// ==========================================

class Prop {
  Prop(this.prop, Object? value) {
    this.value = value.toString().isEmpty ? "''" : value.toString();
  }
  final String prop;
  late final String value;
}

// ==========================================
// CLASS: PropTable
// ==========================================

class PropTable extends StatelessWidget {
  const PropTable({
    required this.title, required this.children, super.key,
  });
  final String title;
  final List<Prop> children;

  @override
  Widget build(BuildContext context) {
    return SingleChildScrollView(
      padding: const EdgeInsets.all(15),
      child: SelectionArea(
        child: Column(
          children: [
            Padding(
              padding: const EdgeInsets.only(bottom: 20),
              child: Text(
                title,
                style: const TextStyle(fontWeight: FontWeight.bold),
              ),
            ),
            SizedBox(
              width: MediaQuery.of(context).size.width.clamp(0, 1000) * 0.80,
              child: Table(
                border: TableBorder.all(color: Colors.grey.shade300),
                defaultVerticalAlignment: TableCellVerticalAlignment.middle,
                columnWidths: const {
                  0: IntrinsicColumnWidth(flex: 1),
                  1: FlexColumnWidth(2),
                },
                children: children
                    .map(
                      (e) => TableRow(
                        decoration: BoxDecoration(
                          color: children.indexOf(e).isEven
                              ? Colors.grey.shade200
                              : Theme.of(context).scaffoldBackgroundColor,
                        ),
                        children: [
                          Padding(
                            padding: const EdgeInsets.all(8),
                            child: Text(
                              e.prop,
                              style: const TextStyle(
                                fontFamily: 'Verdana',
                                fontWeight: FontWeight.bold,
                                fontSize: 12,
                              ),
                            ),
                          ),
                          Padding(
                            padding: const EdgeInsets.all(8),
                            child: Text(
                              e.value,
                              style: const TextStyle(
                                fontFamily: 'Verdana',
                                fontSize: 12,
                              ),
                            ),
                          ),
                        ],
                      ),
                    )
                    .toList(),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

// ==========================================
// CLASS: PackageInfoTab
// ==========================================

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

  @override
  Widget build(BuildContext context) {
    final package = AppInfo.of(context).package;

    return PropTable(
      title: 'Information about the installed package and version',
      children: [
        Prop('appName', package.appName),
        Prop('packageName', package.packageName),
        Prop('buildSignature', package.buildSignature),
        Prop('installerStore', package.installerStore),
        Prop('version', package.version.toString()),
        Prop('versionWithoutBuild', package.versionWithoutBuild.toString()),
      ],
    );
  }
}

// ==========================================
// CLASS: PlatformInfoTab
// ==========================================

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

  @override
  Widget build(BuildContext context) {
    final platform = AppInfo.of(context).platform;
    const encoder = JsonEncoder.withIndent('  ');
    return PropTable(
      title: 'Information about the platform for which the app was built',
      children: [
        Prop('isAndroid', platform.isAndroid),
        Prop('isIOS', platform.isIOS),
        Prop('isLinux', platform.isLinux),
        Prop('isMacOS', platform.isMacOS),
        Prop('isWeb', platform.isWeb),
        Prop('isWindows', platform.isWindows),
        Prop('isFuchsia', platform.isFuchsia),
        Prop('isDesktop', platform.isDesktop),
        Prop('isMobile', platform.isMobile),
        Prop('device', 'BaseDeviceInfo'),
        Prop('deviceJson', encoder.convert(platform.deviceJson)),
        Prop('executable', platform.executable),
        Prop('resolvedExecutable', platform.resolvedExecutable),
        Prop('executableArguments', platform.executableArguments),
        Prop('localHostname', platform.localHostname),
        Prop('localeName', platform.localeName),
        Prop('numberOfProcessors', platform.numberOfProcessors),
        Prop('operatingSystem', platform.operatingSystem),
        Prop('operatingSystemVersion', platform.operatingSystemVersion),
        Prop('packageConfig', platform.packageConfig),
        Prop('pathSeparator', platform.pathSeparator),
        Prop('script', platform.script),
        Prop('version', platform.version),
        Prop('environment', 'Map<String, String>'),
      ],
    );
  }
}

// ==========================================
// CLASS: TargetInfoTab
// ==========================================

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

  @override
  Widget build(BuildContext context) {
    final target = AppInfo.of(context).target;

    return PropTable(
      title:
          'Information about the platform on which the app is currently executing',
      children: [
        Prop('defaultPlatform', target.defaultPlatform),
        Prop('isAndroid', target.isAndroid),
        Prop('isIOS', target.isIOS),
        Prop('isLinux', target.isLinux),
        Prop('isMacOS', target.isMacOS),
        Prop('isWeb', target.isWeb),
        Prop('isWindows', target.isWindows),
        Prop('isFuchsia', target.isFuchsia),
        Prop('isDesktop', target.isDesktop),
        Prop('isDesktopWeb', target.isDesktopWeb),
        Prop('isMobile', target.isMobile),
        Prop('isMobileWeb', target.isMobileWeb),
        Prop('isTablet', target.isTablet),
      ],
    );
  }
}
14
likes
150
points
954
downloads

Documentation

Documentation
API reference

Publisher

verified publishertazatechnology.com

Weekly Downloads

Utility package to easily access device, platform, target, package, and app version information

Homepage
Repository (GitHub)
View/report issues

License

BSD-3-Clause (license)

Dependencies

device_info_plus, flutter, package_info_plus, universal_io, version

More

Packages that depend on flutter_app_info