Flutter网络状态管理插件network_state_handler的使用

Flutter网络状态管理插件network_state_handler的使用

插件简介

network_state_handler 是一个简单友好的网络状态处理工具,用于管理请求的状态,例如初始状态、加载中状态、已加载状态或错误状态。您可以将其与任何喜欢的网络库(如 httpdio)一起使用。


安装

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

dependencies:
  network_state_handler: ^0.0.2

2. 运行以下命令以更新包依赖:

flutter pub get

导入

在您的代码中使用该插件时,首先需要导入:

import 'package:network_state_handler/network_state_handler.dart';

使用示例

以下是一个完整的示例代码,展示如何使用 network_state_handler 来管理网络请求的状态。

示例代码

import 'package:flutter/material.dart';
import 'package:network_state_handler/network_state_handler.dart';
import 'package:networking_freezed_dio/repos/api_repo.dart';
import 'model/list_user_response.dart';

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

class MyApp extends StatelessWidget {
  // 应用根组件
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: const ListUser(),
    );
  }
}

class ListUser extends StatefulWidget {
  const ListUser({Key? key}) : super(key: key);

  [@override](/user/override)
  _ListUserState createState() => _ListUserState();
}

class _ListUserState extends State<ListUser> {
  final APIRepository _apiRepository = APIRepository();
  ResultState<ListUserResponse> state = const ResultState.loading(); // 当前状态
  ResultState<bool> boolstate = const ResultState.loading();
  final GlobalKey<ScaffoldState> _scaffoldkey = GlobalKey<ScaffoldState>();

  // 获取用户列表
  Future<void> getUsers() async {
    ApiResult<ListUserResponse> apiResult = await _apiRepository.fetchListOfUser();

    apiResult.when(
      success: (ListUserResponse? user) {
        setState(() {
          state = ResultState.data(data: user); // 数据成功加载
        });
      },
      failure: (NetworkExceptions? error) {
        print(error.toString());
        setState(() {
          state = ResultState.error(error: error); // 加载失败
        });
      },
    );
  }

  // 删除用户
  Future<void> deleteUser(int userId) async {
    ApiResult<bool> apiResult = await _apiRepository.deleteUser(userId);

    apiResult.when(
      success: (bool? user) {
        setState(() {
          boolstate = ResultState.data(data: user); // 删除成功
        });
      },
      failure: (NetworkExceptions? error) {
        print(error.toString());
        setState(() {
          boolstate = ResultState.error(error: error); // 删除失败
        });
      },
    );
  }

  [@override](/user/override)
  void initState() {
    super.initState();
    getUsers(); // 初始化时获取数据
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      key: _scaffoldkey,
      body: SafeArea(
        child: state.when(
          idle: () => Container(), // 初始状态
          loading: () => const Center(child: CircularProgressIndicator()), // 加载中状态
          data: (ListUserResponse? data) {
            return data!.user!.isEmpty
                ? const Center(child: Text("No Data found")) // 没有数据时显示提示
                : ListView.separated(
                    itemCount: data.user!.length,
                    separatorBuilder: (_, __) => const Divider(),
                    itemBuilder: (ctx, index) => Dismissible(
                      key: ValueKey(data.user![index].id),
                      background: Container(
                        color: Colors.red,
                        alignment: Alignment.centerLeft,
                        child: const Icon(Icons.delete, color: Colors.white),
                      ),
                      onDismissed: (direction) async {
                        if (direction == DismissDirection.startToEnd) {
                          // 左滑删除
                          await deleteUser(data.user![index].id!);
                          data.user!.removeAt(index);
                          SnackBar snackBar = const SnackBar(
                            content: Text('Deleted Successfully'),
                          );
                          _scaffoldkey.currentState?.showSnackBar(snackBar);
                        }
                      },
                      direction: DismissDirection.startToEnd,
                      child: ListTile(
                        title: Text(data.user![index].first_name ?? ""),
                        subtitle: Text(data.user![index].email ?? ""),
                        leading: CircleAvatar(
                          backgroundImage: NetworkImage(data.user![index].avatar ?? ""),
                          radius: 30,
                        ),
                      ),
                    ),
                  );
          },
          error: (NetworkExceptions? error) {
            return Text(NetworkExceptions.getErrorMessage(error!)); // 错误状态
          },
        ),
      ),
    );
  }
}

更多关于Flutter网络状态管理插件network_state_handler的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter网络状态管理插件network_state_handler的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


network_state_handler 是一个用于在 Flutter 应用中监听和管理网络状态变化的插件。它可以帮助你检测设备的网络连接状态(如 WiFi、移动数据、无网络等),并在网络状态发生变化时执行相应的操作。

安装插件

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

dependencies:
  flutter:
    sdk: flutter
  network_state_handler: ^1.0.0  # 请使用最新版本

然后运行 flutter pub get 来安装插件。

基本用法

  1. 导入插件

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

    import 'package:network_state_handler/network_state_handler.dart';
    
  2. 初始化网络状态监听

    你可以在应用的 initState 方法中初始化网络状态监听:

    class MyApp extends StatefulWidget {
      [@override](/user/override)
      _MyAppState createState() => _MyAppState();
    }
    
    class _MyAppState extends State<MyApp> {
      NetworkStateHandler _networkStateHandler;
    
      [@override](/user/override)
      void initState() {
        super.initState();
        _networkStateHandler = NetworkStateHandler();
        _networkStateHandler.initialize();
        _networkStateHandler.onNetworkStateChanged.listen((NetworkState state) {
          // 处理网络状态变化
          print('Network state changed: $state');
        });
      }
    
      [@override](/user/override)
      void dispose() {
        _networkStateHandler.dispose();
        super.dispose();
      }
    
      [@override](/user/override)
      Widget build(BuildContext context) {
        return MaterialApp(
          home: Scaffold(
            appBar: AppBar(
              title: Text('Network State Handler Example'),
            ),
            body: Center(
              child: Text('Check network state'),
            ),
          ),
        );
      }
    }
    
  3. 获取当前网络状态

    你可以使用 _networkStateHandler.currentState 来获取当前的网络状态:

    NetworkState currentState = _networkStateHandler.currentState;
    print('Current network state: $currentState');
    
  4. 处理网络状态变化

    通过监听 onNetworkStateChanged 流,你可以在网络状态发生变化时执行相应的操作:

    _networkStateHandler.onNetworkStateChanged.listen((NetworkState state) {
      if (state == NetworkState.wifi) {
        print('Connected to WiFi');
      } else if (state == NetworkState.mobile) {
        print('Connected to mobile data');
      } else if (state == NetworkState.none) {
        print('No network connection');
      }
    });
    

网络状态枚举

NetworkState 枚举定义了不同的网络状态:

  • NetworkState.wifi: 设备连接到 WiFi。
  • NetworkState.mobile: 设备连接到移动数据。
  • NetworkState.none: 设备没有网络连接。

示例代码

以下是一个完整的示例代码,展示了如何使用 network_state_handler 插件来监听和处理网络状态变化:

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

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

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

class _MyAppState extends State<MyApp> {
  NetworkStateHandler _networkStateHandler;
  NetworkState _currentState = NetworkState.none;

  [@override](/user/override)
  void initState() {
    super.initState();
    _networkStateHandler = NetworkStateHandler();
    _networkStateHandler.initialize();
    _networkStateHandler.onNetworkStateChanged.listen((NetworkState state) {
      setState(() {
        _currentState = state;
      });
      _handleNetworkStateChange(state);
    });
  }

  void _handleNetworkStateChange(NetworkState state) {
    if (state == NetworkState.wifi) {
      print('Connected to WiFi');
    } else if (state == NetworkState.mobile) {
      print('Connected to mobile data');
    } else if (state == NetworkState.none) {
      print('No network connection');
    }
  }

  [@override](/user/override)
  void dispose() {
    _networkStateHandler.dispose();
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Network State Handler Example'),
        ),
        body: Center(
          child: Text('Current Network State: $_currentState'),
        ),
      ),
    );
  }
}
回到顶部