Tag: ping

  • Flutter StreamBuilder & Ping 套件 Example

    Flutter StreamBuilder & Ping 套件 Example

    相較於一次性的非同步執行緒 FutureBuilder,StreamBuilder 能持續運作並可搭配 StreamController 達到更新畫面資料時,不需要整個重新 build 而只更動使用 StreamBuilder 的區塊。

    以下StreamBuilder 範例為使用 dart_ping 套件,建立一個簡易的網址偵測 App。

    程式規劃和引用的套件(pubspec.yaml)

    main.dart

    import 'package:flutter/material.dart';

    import 'package:network_toolkit/screens/ping_screen.dart';

    void main() {
    runApp(
    const AppEntryPoint()
    );
    }

    class AppEntryPoint extends StatelessWidget {
    const AppEntryPoint({super.key});

    @override
    Widget build(BuildContext context) {
    return MaterialApp(
    title: 'Network Toolkit',
    theme: ThemeData(
    useMaterial3: true,
    primarySwatch: Colors.green,
    ),
    routes: {
    "/ping":(BuildContext context) => const PingScreen(),
    },
    initialRoute: "/ping",
    );
    }
    }

    screens/ping_screen.dart

    import 'package:flutter/material.dart';
    import 'dart:async';
    import 'package:dart_ping/dart_ping.dart';

    import 'package:network_toolkit/components/ping_result_component.dart';

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

    @override
    State createState() {
    return _PingScreen();
    }
    }

    class _PingScreen extends State<PingScreen> {
    bool _userInputTextFieldEnabled = true;
    String _urlOrIP = "";
    late StreamController _controller;
    final ScrollController _scrollController = ScrollController();
    List<String> _pingResultList = [];

    @override
    void initState() {
    super.initState();
    _controller = StreamController.broadcast(); // Initial
    }

    @override
    Widget build(BuildContext context) {
    var textEditController = TextEditingController( text: _urlOrIP );

    Widget userInputTextField = SizedBox(
    width: 500,
    child: TextField(
    decoration: const InputDecoration(
    border: OutlineInputBorder(),
    hintText: 'Input URL or IP',
    ),
    controller: textEditController,
    enabled: _userInputTextFieldEnabled,
    onSubmitted: (inputvalue){
    _urlOrIP = inputvalue;
    _pingResultList = [];

    setState(() {
    _userInputTextFieldEnabled = false;
    });

    // Begin ping process and listen for output
    final ping = Ping(_urlOrIP, count: 5);
    ping.stream.listen(
    (event) {
    _pingResultList.add("${ping.command} : ${event.toString()}");

    _controller.sink.add(_pingResultList);
    },
    onDone: () {
    setState(() {
    _userInputTextFieldEnabled = true;
    });
    },
    );
    },
    ),
    );

    return Scaffold(
    appBar: AppBar(
    title: const Text("Ping"),
    ),
    body: Column(
    children: [
    userInputTextField,
    StreamBuilder(
    initialData: _pingResultList,
    stream: _controller.stream,
    builder: (context, n) {
    List<String> results = n.data as List<String>;
    return Expanded(
    child: ListView(
    controller: _scrollController,
    children: [
    ...results.map((pingResult) => PingResultComponent(pingResult)).toList()
    ]
    )
    );
    }
    ),
    ]
    ),
    );
    }

    @override
    void dispose() {
    super.dispose();
    _controller.close();
    }
    }

    components/ping_result_component.dart

    import 'package:flutter/material.dart';

    // ignore: must_be_immutable
    class PingResultComponent extends StatefulWidget {
    String pingResult;

    PingResultComponent(this.pingResult, {super.key});

    @override
    State createState() {
    return _PingResultComponent();
    }
    }

    class _PingResultComponent extends State<PingResultComponent> {
    @override
    Widget build(BuildContext context) {
    Widget pingResultValueText =
    Flexible(
    child: Text(
    widget.pingResult,
    )
    );

    return Card(
    child: ListTile(
    title: Row(
    children: [
    pingResultValueText,
    ]
    ),
    ),
    );
    }
    }
  • Sys internal Suite – PsPing (ping強化版)

    微軟有針對系統診斷調教提供一個免費的工具包 Sys internal Suite,裡面提供了很多很好用的工具。

    以下說明可檢測port、頻寬、網路延遲的強化版Ping工具:PSPing

    (more…)