Flutter IP地址查询插件ipwhois的使用

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

Flutter IP地址查询插件ipwhois的使用

插件简介

通过使用ipwhois插件,您可以获取有关互联网连接的IP信息,例如IPv4和IPv6地址、城市名称、国家名称、地区、纬度和经度、大陆代码、时区、互联网服务提供商等。

  • 获取到国家或城市信息后,可以根据不同的国家或城市渲染不同的设计。
  • 通过识别不同的IP地址来更改应用程序的语言。

img

安装插件

1. 在pubspec.yaml文件中添加依赖:

dependencies:
  ipwhois: ^1.1.0

2. 运行以下命令以安装依赖:

flutter pub get

Android配置

<项目根目录>/android/app/src/main/AndroidManifest.xml中添加以下权限:

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

使用示例

1. 导入包

import 'package:ipwhois/ipwhois.dart';

2. 获取完整的IP信息

void main() async {
  // 获取IPv4信息
  final IpInfo? resultV4 = await getMyIpInfo();
  print(resultV4); // 输出完整的IPv4信息

  if (resultV4 != null) {
    print('IPv4: ${resultV4.ip}');  // 输出IPv4地址
    print('城市: ${resultV4.city}');  // 输出城市
    print('国家: ${resultV4.country}');  // 输出国家
    print('国家代码: ${resultV4.countryCode}');  // 输出国家代码
    print('纬度: ${resultV4.latitude}');  // 输出纬度
    print('经度: ${resultV4.longitude}');  // 输出经度
    print('大陆代码: ${resultV4.continentCode}');  // 输出大陆代码
    print('地区: ${resultV4.region}');  // 输出地区
    print('地区代码: ${resultV4.regionCode}');  // 输出地区代码
    print('组织: ${resultV4.organization}');  // 输出组织
  }

  // 获取IPv6信息
  final IpInfo? resultV6 = await getMyIpInfo(version: IpVersion.v6);
  print(resultV6); // 输出完整的IPv6信息
}

3. 仅获取IP地址

void main() async {
  // 获取IPv4地址
  final String? myIpV4 = await getMyIp();
  print('IPv4地址: $myIpV4');  // 输出IPv4地址

  // 获取IPv6地址
  final String? myIpV6 = await getMyIp(version: IpVersion.v6);
  print('IPv6地址: $myIpV6');  // 输出IPv6地址
}

完整示例Demo

以下是一个完整的Flutter示例应用,展示了如何使用ipwhois插件查询IP信息并显示在界面上。

main.dart

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'IP Whois Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: IpInfoPage(),
    );
  }
}

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

class _IpInfoPageState extends State<IpInfoPage> {
  IpInfo? _ipInfoV4;
  IpInfo? _ipInfoV6;
  String? _myIpV4;
  String? _myIpV6;

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

  Future<void> _fetchIpInfo() async {
    try {
      // 获取IPv4信息
      final IpInfo? resultV4 = await getMyIpInfo();
      setState(() {
        _ipInfoV4 = resultV4;
      });

      // 获取IPv6信息
      final IpInfo? resultV6 = await getMyIpInfo(version: IpVersion.v6);
      setState(() {
        _ipInfoV6 = resultV6;
      });

      // 获取IPv4地址
      final String? myIpV4 = await getMyIp();
      setState(() {
        _myIpV4 = myIpV4;
      });

      // 获取IPv6地址
      final String? myIpV6 = await getMyIp(version: IpVersion.v6);
      setState(() {
        _myIpV6 = myIpV6;
      });
    } catch (e) {
      print('Error fetching IP info: $e');
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('IP Whois Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Text('IPv4信息:', style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold)),
            if (_ipInfoV4 != null)
              Column(
                crossAxisAlignment: CrossAxisAlignment.start,
                children: [
                  Text('IP: ${_ipInfoV4!.ip}'),
                  Text('城市: ${_ipInfoV4!.city}'),
                  Text('国家: ${_ipInfoV4!.country}'),
                  Text('国家代码: ${_ipInfoV4!.countryCode}'),
                  Text('纬度: ${_ipInfoV4!.latitude}'),
                  Text('经度: ${_ipInfoV4!.longitude}'),
                  Text('大陆代码: ${_ipInfoV4!.continentCode}'),
                  Text('地区: ${_ipInfoV4!.region}'),
                  Text('地区代码: ${_ipInfoV4!.regionCode}'),
                  Text('组织: ${_ipInfoV4!.organization}'),
                ],
              )
            else
              Text('正在加载...'),

            SizedBox(height: 20),

            Text('IPv6信息:', style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold)),
            if (_ipInfoV6 != null)
              Column(
                crossAxisAlignment: CrossAxisAlignment.start,
                children: [
                  Text('IP: ${_ipInfoV6!.ip}'),
                  Text('城市: ${_ipInfoV6!.city}'),
                  Text('国家: ${_ipInfoV6!.country}'),
                  Text('国家代码: ${_ipInfoV6!.countryCode}'),
                  Text('纬度: ${_ipInfoV6!.latitude}'),
                  Text('经度: ${_ipInfoV6!.longitude}'),
                  Text('大陆代码: ${_ipInfoV6!.continentCode}'),
                  Text('地区: ${_ipInfoV6!.region}'),
                  Text('地区代码: ${_ipInfoV6!.regionCode}'),
                  Text('组织: ${_ipInfoV6!.organization}'),
                ],
              )
            else
              Text('正在加载...'),

            SizedBox(height: 20),

            Text('IPv4地址:', style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold)),
            Text(_myIpV4 ?? '正在加载...'),

            SizedBox(height: 20),

            Text('IPv6地址:', style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold)),
            Text(_myIpV6 ?? '正在加载...'),
          ],
        ),
      ),
    );
  }
}

更多关于Flutter IP地址查询插件ipwhois的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter IP地址查询插件ipwhois的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用ipwhois插件(尽管需要注意的是,ipwhois插件在Flutter社区中可能并不常见,且通常IP地址查询和WHOIS查询是两个独立的功能,且WHOIS查询通常不直接通过IP地址进行,而是通过域名进行。但为了符合你的要求,这里假设存在一个支持IP地址WHOIS查询的Flutter插件或我们通过一个HTTP请求来实现类似功能)的示例代码。

由于直接名为ipwhois的Flutter插件可能不存在,这里我们将使用Flutter的HTTP客户端功能(http包)来发送请求到一个WHOIS查询服务(注意,不是所有WHOIS服务都支持IP地址查询,大多数支持域名查询),并通过解析响应来获取IP地址的相关信息(这通常不是传统的WHOIS信息,但可以是IP地理位置等信息)。

首先,确保你的pubspec.yaml文件中包含了http依赖:

dependencies:
  flutter:
    sdk: flutter
  http: ^0.13.3  # 确保版本号是最新的

然后,在你的Dart文件中,你可以编写如下代码来查询IP地址信息(这里以获取IP地理位置信息为例,而不是传统的WHOIS信息):

import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';

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

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

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

class _MyHomePageState extends State<MyHomePage> {
  String _ipInfo = '';

  void _queryIpInfo(String ipAddress) async {
    String url = 'https://ipinfo.io/$ipAddress/json'; // 使用ipinfo.io服务获取IP信息
    http.Response response = await http.get(Uri.parse(url));

    if (response.statusCode == 200) {
      Map<String, dynamic> data = jsonDecode(response.body);
      setState(() {
        _ipInfo = jsonEncode(data, prettyPrint: true); // 格式化JSON输出以便阅读
      });
    } else {
      setState(() {
        _ipInfo = 'Failed to fetch data: ${response.statusCode}';
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter IP Address Info Query'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            TextField(
              decoration: InputDecoration(
                labelText: 'Enter IP Address',
              ),
              onChanged: (String value) {
                // 这里可以添加输入验证逻辑
              },
              onEditingComplete: () async {
                String ipAddress = value.trim();
                if (ipAddress.isNotEmpty) {
                  _queryIpInfo(ipAddress);
                }
              },
            ),
            SizedBox(height: 20),
            Text(
              _ipInfo,
              style: TextStyle(fontSize: 16),
            ),
          ],
        ),
      ),
    );
  }
}

在这个示例中,我们使用ipinfo.io服务来获取IP地址的地理位置信息。用户在文本框中输入IP地址后,点击键盘的“完成”按钮(或你可以添加一个专门的按钮来触发查询),应用将发送一个HTTP GET请求到ipinfo.io,并解析返回的JSON数据以显示在屏幕上。

请注意,这个示例并不是传统的WHOIS查询,因为WHOIS查询通常用于域名而不是IP地址。如果你确实需要进行IP地址的WHOIS查询,你可能需要找到一个支持这种查询的第三方服务,并使用类似的HTTP请求方法来获取和处理响应。不过,这样的服务可能比较罕见,因为IP地址的分配和注册信息通常由区域互联网注册管理机构(如ARIN、RIPE NCC等)管理,并且这些机构提供的WHOIS服务通常不支持直接的HTTP请求,而是需要通过特定的客户端或命令行工具来访问。

回到顶部