Flutter设备厂商信息获取插件device_vendor_info的使用

发布于 1周前 作者 vueper 来自 Flutter

Flutter设备厂商信息获取插件device_vendor_info的使用

1. 简介

device_vendor_info 是一个用于在Flutter环境中获取硬件信息的插件,它提供了关于BIOS、主板和系统的额外信息。这些信息可以帮助软件根据特定的厂商允许或限制某些功能。

2. 使用方法

2.1 安装依赖

pubspec.yaml 文件中添加 device_vendor_info 依赖:

dependencies:
    device_vendor_info: # 版本约束
2.2 导入与实现

在 Dart 文件中导入 device_vendor_info 并使用其提供的 API 获取硬件信息。以下是一个简单的示例代码,展示了如何获取 BIOS 信息并打印厂商名称:

import 'package:device_vendor_info/device_vendor_info.dart';
import 'package:flutter/widgets.dart';

Future<void> main() async {
    WidgetsFlutterBinding.ensureInitialized();

    final bios = await getBiosInfo();
    print(bios.vendor);
}
2.3 测试

为了确保测试能够在不支持的平台上正常运行,需要在测试代码中调用 overrideCorrectTargetPlatform 并使用 MockDeviceVendorInfoLoader 替换 DeviceVendorInfo.instance。以下是一个完整的测试示例:

// 指定测试平台以防止在不支持的平台上运行时测试失败
@TestOn("windows || mac-os || linux")

import 'package:device_vendor_info/device_vendor_info.dart';
import 'package:device_vendor_info/instance.dart' show DeviceVendorInfo;
import 'package:device_vendor_info/testing.dart';
import 'package:flutter_test/flutter_test.dart';

void main() {
    setUpAll(() {
        // 首先调用此方法
        overrideCorrectTargetPlatform();

        // 将实例替换为模拟加载器
        DeviceVendorInfo.instance = MockDeviceVendorInfoLoader(
          BiosInfo(vendor: "Generic vendor", version: "v1.23", releaseDate: DateTime(2023, 2, 21)),
          BoardInfo(manufacturer: "Default", productName: "", version: ""),
          SystemInfo(family: "", manufacturer: "", productName: "", version: "")
        );
    });

    test("Run test", () {
        // 在这里编写测试实现
    });

    testWidget("Run test with widget", (tester) async {
        // 在这里编写带有 Flutter 小部件的测试
    });
}

3. 完整示例 Demo

以下是一个完整的 Flutter 应用程序示例,展示了如何使用 device_vendor_info 插件来显示设备的硬件信息。这个示例应用程序会显示虚拟化状态、BIOS 信息、主板信息和系统信息。

import 'package:device_vendor_info/device_vendor_info.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  runApp(const MaterialApp(home: DeviceInfoPage()));
}

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

  [@override](/user/override)
  State<DeviceInfoPage> createState() => _DeviceInfoPageState();
}

class _DeviceInfoPageState extends State<DeviceInfoPage> {
  Container _buildInfoWidget<T extends Object>(BuildContext context,
      {required String displayName,
      required Future<T> Function() infoFetch,
      required List<ListTile> Function(T info) result}) {
    final ThemeData currentTheme = Theme.of(context);

    return Container(
        constraints: const BoxConstraints(maxWidth: 768),
        margin: const EdgeInsets.symmetric(horizontal: 4, vertical: 10),
        child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              Text(displayName,
                  style: TextStyle(
                      color: currentTheme.dividerColor, fontSize: 12)),
              const Divider(),
              FutureBuilder<T>(
                  future: infoFetch(),
                  builder: (context, snapshot) {
                    if (snapshot.hasError) {
                      return const Icon(Icons.error_outline);
                    } else if (!snapshot.hasData ||
                        snapshot.connectionState == ConnectionState.waiting) {
                      return const CircularProgressIndicator();
                    }

                    return Column(
                        mainAxisSize: MainAxisSize.min,
                        children: result(snapshot.data!));
                  })
            ]));
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
            backgroundColor: Colors.blue,
            title: Text("当前平台: ${defaultTargetPlatform.name}",
                style: const TextStyle(color: Colors.white))),
        body: Column(children: [
          Expanded(
              child: ListView(children: [
            _buildInfoWidget(context,
                displayName: "虚拟化",
                infoFetch: isVirtualized,
                result: (info) => <ListTile>[
                      ListTile(
                        title: const Text("虚拟化"),
                        trailing: Text(info ? "是" : "否"),
                      )
                    ]),
            _buildInfoWidget<BiosInfo>(context,
                displayName: "BIOS",
                infoFetch: getBiosInfo,
                result: (info) => <ListTile>[
                      ListTile(
                          title: const Text("厂商名称"),
                          trailing: Text(info.vendor ?? "(未知)")),
                      ListTile(
                          title: const Text("版本"),
                          trailing: Text(info.version ?? "(未知)")),
                      ListTile(
                          title: const Text("发布日期"),
                          trailing: Text(info.releaseDate != null
                              ? DateFormat("yyyy-MM-dd")
                                  .format(info.releaseDate!)
                              : "(未知)"))
                    ]),
            _buildInfoWidget<BoardInfo>(context,
                displayName: "主板",
                infoFetch: getBoardInfo,
                result: (info) => <ListTile>[
                      ListTile(
                          title: const Text("产品名称"),
                          trailing: Text(info.productName ?? "(未知)")),
                      ListTile(
                          title: const Text("制造商"),
                          trailing: Text(info.manufacturer ?? "(未知)")),
                      ListTile(
                          title: const Text("版本"),
                          trailing: Text(info.version ?? "(未知)"))
                    ]),
            _buildInfoWidget<SystemInfo>(context,
                displayName: "系统",
                infoFetch: getSystemInfo,
                result: (info) => <ListTile>[
                      ListTile(
                          title: const Text("系列"),
                          trailing: Text(info.family ?? "(未知)")),
                      ListTile(
                          title: const Text("产品名称"),
                          trailing: Text(info.productName ?? "(未知)")),
                      ListTile(
                          title: const Text("制造商"),
                          trailing: Text(info.manufacturer ?? "(未知)")),
                      ListTile(
                          title: const Text("版本"),
                          trailing: Text(info.version ?? "(未知)"))
                    ])
          ]))
        ]));
  }
}

更多关于Flutter设备厂商信息获取插件device_vendor_info的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter设备厂商信息获取插件device_vendor_info的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用device_vendor_info插件来获取设备厂商信息的示例代码。

首先,你需要在你的Flutter项目中添加device_vendor_info插件。你可以在你的pubspec.yaml文件中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  device_vendor_info: ^x.y.z  # 请将x.y.z替换为最新版本号

然后,运行以下命令来安装依赖:

flutter pub get

接下来,你可以在你的Dart代码中使用该插件来获取设备厂商信息。以下是一个完整的示例:

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

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Device Vendor Info Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String? brand;
  String? model;
  String? board;
  String? fingerprint;
  String? hardware;
  String? manufacturer;
  String? product;
  String? serial;
  String? type;

  @override
  void initState() {
    super.initState();
    _getDeviceInfo();
  }

  Future<void> _getDeviceInfo() async {
    try {
      final DeviceVendorInfo deviceInfo = await DeviceVendorInfo.getInstance();
      setState(() {
        brand = deviceInfo.brand;
        model = deviceInfo.model;
        board = deviceInfo.board;
        fingerprint = deviceInfo.fingerprint;
        hardware = deviceInfo.hardware;
        manufacturer = deviceInfo.manufacturer;
        product = deviceInfo.product;
        serial = deviceInfo.serial;
        type = deviceInfo.type;
      });
    } catch (e) {
      print("Error fetching device info: $e");
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Device Vendor Info'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Text('Brand: $brand'),
            Text('Model: $model'),
            Text('Board: $board'),
            Text('Fingerprint: $fingerprint'),
            Text('Hardware: $hardware'),
            Text('Manufacturer: $manufacturer'),
            Text('Product: $product'),
            Text('Serial: $serial'),
            Text('Type: $type'),
          ],
        ),
      ),
    );
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,该应用在启动时获取设备厂商信息并将其显示在页面上。

  • DeviceVendorInfo.getInstance()方法用于获取DeviceVendorInfo实例。
  • 使用setState方法来更新UI,以便在获取到设备信息后能够实时显示在页面上。

你可以运行这个示例代码来查看设备厂商信息的输出。如果你需要获取更多或更详细的设备信息,请参考device_vendor_info插件的官方文档。

回到顶部