Flutter网络使用情况监控插件network_usage的使用

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

Flutter网络使用情况监控插件 network_usage 的使用

network_usage 是一个用于监控Android和iOS设备网络使用情况的Flutter插件。它可以帮助开发者获取应用程序的数据使用情况,包括接收和发送的数据量。

获取开始

Android 使用方法

在Android上使用此插件时,首先需要初始化插件并请求权限。以下是具体的步骤和示例代码:

NetworkUsageModel.init(); // 仅在Android上需要调用

List<NetworkUsageModel> networkUsage = await MethodChannelNetworkUsage.networkUsageAndroid(
    withAppIcon: true,
    dataUsageType: NetworkUsageType.wifi,
    oldVersion: false, // 对于低于23(Marshmallow)版本的Android应设置为true
);

返回的结果将是一个包含 NetworkUsageModel 对象的列表:

[
    NetworkUsageModel({
        String appName; // 应用名称
        String packageName; // 包名
        Uint8List appIconBytes; // 图标字节数据
        int received; // 接收到的数据量
        int sent; // 发送的数据量
    }),
    ...
]

iOS 使用方法

在iOS设备上,可以请求总的数据使用情况。以下是如何获取WiFi和蜂窝数据使用的示例:

IOSNetworkUsageModel networkIOSUsage = await MethodChannelNetworkUsage.networkUsageIOS();

返回的结果将是一个 IOSNetworkUsageModel 对象:

IOSNetworkUsageModel({
    int wifiComplete, // 总WiFi数据(接收+发送)
    int wifiReceived, // WiFi接收到的数据量
    int wifiSent, // 通过WiFi发送的数据量
    int wwanComplete, // 总移动数据(接收+发送)
    int wwanReceived, // 移动数据接收到的数据量
    int wwanSent // 通过移动网络发送的数据量
});

示例Demo

下面是一个完整的示例项目,演示了如何在Flutter应用中集成和使用 network_usage 插件:

import 'dart:io';
import 'package:flutter/material.dart';
import 'package:network_usage/network_usage_method_channel.dart';
import 'dart:async';
import 'package:network_usage/src/model/ios_network_usage_model.dart';
import 'package:network_usage/src/model/network_usage_model.dart';

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Home(),
    );
  }
}

class Home extends StatefulWidget {
  [@override](/user/override)
  _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> {
  List<NetworkUsageModel> _dataUsage = [];
  IOSNetworkUsageModel _dataiOSUsage = IOSNetworkUsageModel();

  [@override](/user/override)
  void initState() {
    initPlatformState();
    super.initState();
  }

  Future<void> initPlatformState() async {
    if (Platform.isAndroid) {
      try {
        print('AndroidNetworkUsage');
        print(await MethodChannelNetworkUsage.init());

        List<NetworkUsageModel> networkUsage = await MethodChannelNetworkUsage.networkUsageAndroid(
          withAppIcon: true,
          dataUsageType: NetworkUsageType.wifi,
        );

        setState(() {
          _dataUsage = networkUsage;
        });
      } catch (e) {
        print(e.toString());
      }
    } else if (Platform.isIOS) {
      try {
        print('IOSNetworkUsage');

        IOSNetworkUsageModel networkIOSUsage = await MethodChannelNetworkUsage.networkUsageIOS();
        setState(() {
          _dataiOSUsage = networkIOSUsage;
        });
      } catch (e) {
        print(e.toString());
      }
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    var size = MediaQuery.of(context).size;
    return Scaffold(
      appBar: AppBar(
        title: const Text('Data Usage Plugin Example'),
      ),
      body: Center(
        child: Platform.isAndroid
            ? Android(dataUsage: _dataUsage, size: size)
            : Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: _dataiOSUsage?.toJson()?.entries
                        ?.map((e) => Text('${e.key}: ${e.value}', overflow: TextOverflow.ellipsis))
                        ?.toList() ??
                    [],
              ),
      ),
    );
  }
}

class Android extends StatelessWidget {
  final List<NetworkUsageModel> dataUsage;
  final Size size;

  const Android({Key? key, required this.dataUsage, required this.size}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return ListView(
      children: [
        if (dataUsage.isNotEmpty)
          for (var item in dataUsage)
            Padding(
              padding: const EdgeInsets.all(8.0),
              child: Row(
                mainAxisAlignment: MainAxisAlignment.start,
                children: [
                  SizedBox(width: 10),
                  if (item.appIconBytes != null)
                    Container(
                      height: 60,
                      width: 60,
                      decoration: BoxDecoration(image: DecorationImage(image: MemoryImage(item.appIconBytes!))),
                    ),
                  SizedBox(width: 10),
                  Column(
                    crossAxisAlignment: CrossAxisAlignment.start,
                    children: [
                      Container(
                        width: size.width * 0.7,
                        child: Text('${item.appName}', overflow: TextOverflow.ellipsis),
                      ),
                      SizedBox(height: 10),
                      Container(
                        width: size.width * 0.7,
                        child: Text(
                          '${item.packageName}',
                          overflow: TextOverflow.ellipsis,
                          style: TextStyle(color: Colors.grey, fontSize: 11),
                        ),
                      ),
                      SizedBox(height: 6),
                      Row(
                        children: [
                          Text(
                            'Received: ${(item.received! / 1048576).toStringAsFixed(4)}MB  ',
                            style: TextStyle(color: Colors.grey[700], fontSize: 13),
                          ),
                          Text(
                            'Sent: ${(item.sent! / 1048576).toStringAsFixed(4)}MB',
                            style: TextStyle(color: Colors.grey[700], fontSize: 13),
                          ),
                        ],
                      ),
                    ],
                  ),
                ],
              ),
            ),
        Divider()
      ],
    );
  }
}

更多关于Flutter网络使用情况监控插件network_usage的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter网络使用情况监控插件network_usage的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中集成并使用network_usage插件来监控网络使用情况的示例代码。network_usage插件允许你获取设备的网络上传和下载数据。

1. 添加依赖

首先,你需要在你的pubspec.yaml文件中添加network_usage依赖:

dependencies:
  flutter:
    sdk: flutter
  network_usage: ^0.6.0  # 请确保使用最新版本

然后运行flutter pub get来安装依赖。

2. 导入插件

在你的Dart文件中导入network_usage插件:

import 'package:network_usage/network_usage.dart';

3. 请求权限

在Android和iOS上,你需要请求适当的权限来访问网络使用情况。你可以在AndroidManifest.xmlInfo.plist中添加这些权限。

Android (AndroidManifest.xml)

确保你已经添加了以下权限:

<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />

注意:PACKAGE_USAGE_STATS权限需要用户手动授予,你可以引导用户到设置页面进行授权。

iOS (Info.plist)

iOS上通常不需要额外的权限配置,但你需要确保应用有网络访问权限。

4. 获取网络使用情况

以下是一个简单的示例,展示如何使用network_usage插件来获取设备的网络上传和下载数据:

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

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

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  NetworkUsage? _networkUsage;
  late double _uploadedBytes;
  late double _downloadedBytes;

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

  Future<void> _initNetworkUsage() async {
    _networkUsage = NetworkUsage();
    
    // 获取网络使用情况
    NetworkUsageData? data = await _networkUsage!.getNetworkUsage();
    if (data != null) {
      setState(() {
        _uploadedBytes = data.uploadedBytes.toDouble();
        _downloadedBytes = data.downloadedBytes.toDouble();
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Network Usage Monitor'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text(
                'Uploaded Bytes: $_uploadedBytes',
                style: TextStyle(fontSize: 20),
              ),
              SizedBox(height: 20),
              Text(
                'Downloaded Bytes: $_downloadedBytes',
                style: TextStyle(fontSize: 20),
              ),
            ],
          ),
        ),
      ),
    );
  }

  @override
  void dispose() {
    _networkUsage?.dispose();
    super.dispose();
  }
}

注意事项

  1. 权限处理:在Android上,PACKAGE_USAGE_STATS权限需要用户手动授予,你可以通过引导用户到设置页面来请求此权限。
  2. 实时数据:如果你需要实时监控网络使用情况,你可能需要在定时器中定期调用getNetworkUsage方法。
  3. 错误处理:在生产代码中,你应该添加适当的错误处理逻辑,以处理可能的异常情况,例如权限被拒绝或网络错误。

这个示例展示了如何集成network_usage插件并获取基本的网络使用情况数据。根据你的具体需求,你可以进一步扩展这个示例。

回到顶部