easylink_flutter 0.9.2 copy "easylink_flutter: ^0.9.2" to clipboard
easylink_flutter: ^0.9.2 copied to clipboard

Wi-Fi Settings to MXCHIP/MXOS-based IoT hardware

example/lib/main.dart

// 示例程序
import 'dart:io';
import 'dart:ui';

import 'package:flutter/material.dart';
// ignore: directives_ordering
import 'dart:async';

import 'package:connectivity/connectivity.dart';
import 'package:flutter/services.dart';
import 'package:easylink_flutter/easylink_flutter.dart';
import 'package:easylink_flutter/easylink_notification.dart';
import 'package:permission_handler/permission_handler.dart';

void main() => runApp(MyApp());

class PersonData {
  String name = '';
  String password = '';
}

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

class _MyAppState extends State<MyApp> with WidgetsBindingObserver {
  String _displayinfo = 'Unknown';
  String _jsoninfo = '';
  String _btntext = '▶️ START';
  final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
  TextEditingController ssidController = TextEditingController();
  TextEditingController pwController = TextEditingController();
  PersonData person = PersonData();
  bool _autovalidate = false;
  bool isstartlink = false;
  String tag = '[EasyLinkFlutter Example APP] ';
  int getrepnum = 0;

  @override
  void initState() {
    getssid();
    getConnectivity();
    ssidController.text = '';
    pwController.text = '';
    WidgetsBinding.instance.addObserver(this);
    super.initState();
  }

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    switch (state) {
      case AppLifecycleState.inactive: // 处于这种状态的应用程序应该假设它们可能在任何时候暂停。
        // print('处于这种状态的应用程序应该假设它们可能在任何时候暂停。');
        break;
      case AppLifecycleState.resumed: // 应用程序可见,前台
        // print('应用程序可见,前台');
        break;
      case AppLifecycleState.paused: // 应用程序不可见,后台
        // print('应用程序不可见,后台');
        // ignore: always_put_control_body_on_new_line
        if (isstartlink) stopbtn();
        break;
      case AppLifecycleState.detached:
        // print('detached');
        break;
    }
  }

  @override
  void dispose() {
    super.dispose();
    ssidController.clear();
    pwController.clear();
    EasylinkFlutter.linkstop();
  }

  // ignore: always_declare_return_types
  getConnectivity() async {
    // ignore: unnecessary_parenthesis
    final ConnectivityResult connectivityResult = await (Connectivity().checkConnectivity());
    if (connectivityResult != ConnectivityResult.wifi) {
      print('没开WiFi');
    }
  }

//获取权限
  // ignore: always_declare_return_types
  requestPermission(Permission rep) async {
    print('申请权限');
    await rep.request();
    checkPermission(rep);
    getrepnum++;
  }

  // ignore: always_declare_return_types
  checkPermission(Permission rep) async {
    // PermissionStatus permission =
    // await PermissionHandler().checkPermissionStatus(rep);
    // Scaffold.of(context).showSnackBar(SnackBar(
    //   content: Text((await rep.status).toString()),
    // ));
    if (await rep.status.isGranted) {
      print('权限申请通过');
      // 以下两种方式都能获取SSID
      getConnectivity();
      getssid();
    } else {
      print('权限申请被拒绝');
      if (getrepnum < 1) {
        requestPermission(rep);
      }
    }
  }

  Future<void> getssid() async {
    try {
      // ignore: always_specify_types
      final Map wifiinfo = await EasylinkFlutter.getwifiinfo();
      print(tag + '插件返回信息:');
      print(wifiinfo);
      //wifiinfo: BSSID,SSID,SSIDDATA
      if (wifiinfo.isEmpty) {
        checkPermission(Permission.locationWhenInUse);
      } else {
        ssidController.text = wifiinfo['SSID'] as String;
      }
    } on PlatformException {
      //ssidController.text  = '';
    }
  }

  // Platform messages are asynchronous, so we initialize in an async method.
  Future<void> linkstart() async {
    String displayinfo;
    // Platform messages may fail, so we use a try/catch PlatformException.
    setState(() {
      _displayinfo = 'Searching...';
    });

    try {
      displayinfo = await EasylinkFlutter.linkstart(
          ssid: person.name,
          password: person.password,
          mode: EasyLinkMode.EASYLINK_V2_PLUS,
          timeout: 60);
    } on PlatformException {
      displayinfo = 'ERROR ID 1';
    }
    try {
      // ignore: always_specify_types
      EasyLinkNotification.instance.addObserver('linkstate', (object) {
        setState(() {
          final String cbstr = object as String;
          if (cbstr != 'Stop' && cbstr != 'Unknown') {
            EasylinkFlutter.linkstop();
          }
          if (cbstr.substring(0, 1) == '{') {
            _jsoninfo = object as String;
            _displayinfo = 'OK';
          } else {
            _displayinfo = object as String;
          }
          isstartlink = false;
          _btntext = '▶️ START';
        });
        EasyLinkNotification.instance.removeNotification('linkstate');
      });
    } on PlatformException {
      displayinfo = 'ERROR! ID 2';
    }

    // If the widget was removed from the tree while the asynchronous platform
    // message was in flight, we want to discard the reply rather than calling
    // setState to update our non-existent appearance.
    // ignore: always_put_control_body_on_new_line
    if (!mounted) return;

    setState(() {
      _displayinfo = displayinfo;
    });
  }

  String _validateName(String value) {
    // ignore: always_put_control_body_on_new_line
    if (value.isEmpty) return '用户名不能为空.';
    // final RegExp nameExp = RegExp(r'^[0-9a-zA-Z]+$');
    // if (!nameExp.hasMatch(value)) return '只能输入字母和数字.';
    return null;
  }

  String _validatePassWord(String value) {
    // ignore: always_put_control_body_on_new_line
    if (value.isEmpty) return '密码不能为空.';
    return null;
  }

  void startbtn() {
    // checkPermission();
    final FormState form = _formKey.currentState;
    if (!form.validate()) {
      _autovalidate = true; // 开始验证每个更改.
      print(tag + '表单输入不正确');
    } else {
      form.save();
      if (!isstartlink) {
        isstartlink = true;
        _btntext = '⏹ STOP';
        _jsoninfo = '';
        linkstart();
      }
    }
  }

  void startorstopbtn() {
    if (isstartlink) {
      stopbtn();
    } else {
      startbtn();
    }
  }

  Future<void> slbtn() async {
    await EasylinkFlutter.ls();
  }

  void stopbtn() {
    isstartlink = false;
    _btntext = '▶️ START';
    EasylinkFlutter.linkstop();
    _displayinfo = 'Stopped.';
  }

  @override
  Widget build(BuildContext context) {
    final MediaQueryData mqdwindow = MediaQueryData.fromWindow(window);
    final double windowWidth = mqdwindow.size.width;
    return MaterialApp(
      home: WillPopScope(
        onWillPop: () async {
          // ignore: always_put_control_body_on_new_line
          if (isstartlink) stopbtn();
          // ignore: always_specify_types
          return Future.value(true);
        },
        child: Scaffold(
          appBar: AppBar(
            leading: Image.asset('images/icon.png'),
            title: Text(_displayinfo),
          ),
          body: Form(
            key: _formKey,
            autovalidate: _autovalidate,
            child: SingleChildScrollView(
              child: Column(
                children: <Widget>[
                  TextFormField(
                    // initialValue: person.name,
                    textCapitalization: TextCapitalization.words,
                    // style: TextStyle(color: Colors.white),
                    decoration: const InputDecoration(
                      border: UnderlineInputBorder(),
                      filled: true,
                      icon: Icon(
                        Icons.wifi,
                        // color: Colors.white,
                      ),
                      hintText: 'WiFi SSID',
                      // hintStyle: TextStyle(color: Colors.white54),
                      labelText: 'WiFi SSID',
                      // labelStyle: TextStyle(color: Colors.white54),
                      // fillColor: Colors.white,
                    ),
                    onSaved: (String value) {
                      person.name = value;
                    },
                    validator: _validateName,
                    controller: ssidController,
                  ),
                  const SizedBox(height: 24.0),
                  TextFormField(
                    decoration: const InputDecoration(
                      border: UnderlineInputBorder(),
                      filled: true,
                      icon: Icon(
                        Icons.vpn_key,
                        // color: Colors.white,
                      ),
                      hintText: 'WiFi Password',
                      // hintStyle: TextStyle(color: Colors.white54),
                      labelText: 'WiFi Password',
                      // labelStyle: TextStyle(color: Colors.white54),
                      // fillColor: Colors.white,
                    ),
                    validator: _validatePassWord,
                    onSaved: (String value) {
                      setState(() {
                        person.password = value;
                      });
                    },
                    controller: pwController,
                  ),
                  Center(
                    child: Column(
                      children: <Widget>[
                        FlatButton(
                          onPressed: startorstopbtn,
                          child: Text(_btntext),
                        ),FlatButton(
                          onPressed: () {
                            stopbtn();
                            exit(0);
                          },
                          child: const Text('EXIT'),
                        ),
                      ],
                    ),
                  ),
                  Container(
                    width: windowWidth,
                    child: Text(_jsoninfo),
                  )
                ],
              ),
            ),
          ),
        ),
      ),
    );
  }
}
1
likes
20
points
12
downloads

Publisher

verified publisheryashi.moe

Weekly Downloads

Wi-Fi Settings to MXCHIP/MXOS-based IoT hardware

Repository (GitHub)
View/report issues

License

LGPL-3.0 (license)

Dependencies

flutter

More

Packages that depend on easylink_flutter

Packages that implement easylink_flutter