対象者
- Flutterでネットワークが繋がっているかリアルタイムで監視したい人
はじめに
インターネットに繋がっていることが前提のアプリを作成しています。そこで、ネットワークに繋がっていない場合は警告のダイアログを出そうと思います。そのため、ネットワークの接続状況をStreamで監視します。
「connectivity_plus」を使って、ネットワークの状況に応じてメッセージがリアルタイムで変わるようにします。また、ネットワークに繋がっていない場合は、警告のメッセージを表示します。本来的には、ダイアログを表示するつもりです。
インストール
connectivity_plusパッケージをインストールします。
flutter pub add connectivity_plus
flutter pub get
実施するソース
本来的に必要なコードは以下の通りです。
Connectivity().onConnectivityChangedがStreamなので、StreamBuilderに渡して、状況によって出力するWidgetを変更します。
StreamBuilder(
stream: Connectivity().onConnectivityChanged,
builder: (BuildContext context,
AsyncSnapshot<ConnectivityResult> snapshot) {
final connectionStatus = snapshot.data!;
return Column(
children: [
Visibility(
visible: connectionStatus == ConnectivityResult.none,
child: Text('ネットワークに繋げてください')),
Text(connectionStatus.toString()),
],
);
},
),
まとめ
以上で、「connectivity_plus」を使用して、リアルタイムに接続状況を把握する方法でした。接続先がインターネットに繋がっているか、という別の問題はありますが、そこまで実装する必要はないかな、と思っています。
参考
-
connectivity_plus
パッケージの公式ページ -
Flutterで通信状況の情報を取得する(connectivity_plus/network_info_plus)
connectivity_plus/network_info_plus を使って、非同期とlistenでネットワーク状況を取得する方法が記載
全ソース
import 'package:connectivity_plus/connectivity_plus.dart';
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const MyHomePage(title: 'Connectivity Demo'),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({Key? key, required this.title}) : super(key: key);
final String title;
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: StreamBuilder(
stream: Connectivity().onConnectivityChanged,
builder: (BuildContext context,
AsyncSnapshot<ConnectivityResult> snapshot) {
if (!snapshot.hasData) {
return const CircularProgressIndicator();
}
if (snapshot.hasError) {
return Text(snapshot.error.toString());
}
final connectionStatus = snapshot.data!;
return Column(
children: [
Visibility(
visible: connectionStatus == ConnectivityResult.none,
child: Text('ネットワークに繋げてください')),
Text(connectionStatus.toString()),
],
);
},
),
),
);
}
}