Flutter时间变化检测插件time_change_detector的使用

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

Flutter时间变化检测插件time_change_detector的使用

简介

time_change_detector 是一个Flutter插件,用于检测设备的时间、日期和时区的变化,支持Android和iOS平台。

设置

Android设置

  • minSdkVersion: 23
  • AndroidManifest.xml文件中添加以下代码:
<application
    ...
    <receiver
        android:name="com.randomforest.time_change_detector.TimeChangeDetectorPlugin"
        android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.TIME_SET" />
            <action android:name="android.intent.action.TIMEZONE_CHANGED" />
            <action android:name="android.intent.action.DATE_CHANGED"/>
        </intent-filter>
    </receiver>
    <activity
        ...

iOS设置

  • 在XCode中将Swift版本更改为5。
  • 更新Podfile中的iOS目标版本为10.0。

示例代码

下面是一个完整的示例demo,展示了如何使用time_change_detector插件来监听时间变化,并在时间变化时创建通知。

// ignore_for_file: avoid_print

import 'dart:async';
import 'dart:io';

import 'package:flutter/material.dart';
import 'package:awesome_notifications/awesome_notifications.dart';
import 'package:time_change_detector/time_change_detector.dart';

const String CHANNEL_KEY = 'your_channel_key';
const String CHANNEL_NAME = 'Your Channel Name';
const String CHANNEL_DESCRIPTION = 'Your Channel Description';
const String APP_TITLE = 'Time Change Detector Demo';
const String EVENT_MESSAGE_DEFAULT = 'Waiting for time change event...';
const String EVENT_MESSAGE_SUCCESS = 'Time Changed at';
const String ERROR = 'Error';
const String STREAM_COMPLETE = 'Stream Complete';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  AwesomeNotifications().initialize(null, [
    NotificationChannel(
        channelKey: CHANNEL_KEY,
        channelName: CHANNEL_NAME,
        channelDescription: CHANNEL_DESCRIPTION,
        importance: NotificationImportance.High)
  ]);
  runApp(const MyApp());
}

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

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> with WidgetsBindingObserver {
  Stream<bool>? _controller;
  String _message = EVENT_MESSAGE_DEFAULT;

  late StreamSubscription _subscription;

  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addObserver(this);
    _permissionHandler();
    _initWatcher();
  }

  @override
  void dispose() {
    super.dispose();
    _subscription.cancel();
  }

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    if (state == AppLifecycleState.resumed && Platform.isAndroid) {
      _initWatcher();
    }
  }

  _permissionHandler() =>
      AwesomeNotifications().isNotificationAllowed().then((isAllowed) {
        if (!isAllowed) {
          // This is just a basic example. For real apps, you must show some
          // friendly dialog box before call the request method.
          // This is very important to not harm the user experience
          AwesomeNotifications().requestPermissionToSendNotifications();
        }
      });

  _initWatcher() {
    _controller ??= TimeChangeDetector().listener(calendarDayChanged: false);
    print(_message);
    _subscription = _controller!.listen((event) {
      setState(() => _message = '$EVENT_MESSAGE_SUCCESS: ${DateTime.now()}');
      createNotification(_message);
      print(_message);
    }, onError: (error) => print('$ERROR: $error'), onDone: () => print(STREAM_COMPLETE));
  }

  @override
  Widget build(BuildContext context) => MaterialApp(
      home: Scaffold(
          appBar: AppBar(title: const Text(APP_TITLE)),
          body: SafeArea(child: Center(child: Text(_message)))));
}

createNotification(String title) =>
    AwesomeNotifications().createNotification(
        content: NotificationContent(id: 10, channelKey: CHANNEL_KEY, title: title));

注意事项

  • 插件目前不支持在应用完全关闭的情况下运行时间变化检测器。如果你有这方面的需求,可以考虑提交Pull Request或讨论实现方案。
  • 如果你对插件有任何改进建议或发现Bug,请先开一个Issue进行讨论。

许可证

本插件采用MIT许可证

希望这个示例能帮助你更好地理解和使用time_change_detector插件!如果有任何问题或需要进一步的帮助,请随时提问。


更多关于Flutter时间变化检测插件time_change_detector的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter时间变化检测插件time_change_detector的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用time_change_detector插件的示例代码。这个插件可以帮助你检测时间变化,比如用户手动更改了设备的系统时间或者时区。

首先,确保你已经在pubspec.yaml文件中添加了time_change_detector依赖:

dependencies:
  flutter:
    sdk: flutter
  time_change_detector: ^x.y.z  # 请替换为最新版本号

然后,运行flutter pub get来安装依赖。

接下来是一个简单的示例代码,展示如何使用time_change_detector来检测时间变化:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: TimeChangeDetectorExample(),
    );
  }
}

class TimeChangeDetectorExample extends StatefulWidget {
  @override
  _TimeChangeDetectorExampleState createState() => _TimeChangeDetectorExampleState();
}

class _TimeChangeDetectorExampleState extends State<TimeChangeDetectorExample> with WidgetsBindingObserver {
  bool _timeChanged = false;

  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance?.addObserver(this);
    TimeChangeDetector.shared.addListener(() {
      setState(() {
        _timeChanged = true;
      });
    });
  }

  @override
  void dispose() {
    WidgetsBinding.instance?.removeObserver(this);
    TimeChangeDetector.shared.removeListener(() {});
    super.dispose();
  }

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    // 可以在这里处理应用生命周期状态的变化,比如暂停和恢复时重新监听时间变化
    if (state == AppLifecycleState.resumed) {
      // 应用恢复时,可以重新确认时间是否变化
      // 例如,重新查询当前时间并与之前保存的时间对比
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Time Change Detector Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Time Changed: $_timeChanged',
              style: TextStyle(fontSize: 24),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () {
                // 重置时间变化状态
                setState(() {
                  _timeChanged = false;
                });
              },
              child: Text('Reset Time Changed Status'),
            ),
          ],
        ),
      ),
    );
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,它包含以下部分:

  1. 依赖添加:在pubspec.yaml中添加time_change_detector依赖。
  2. 主应用MyApp类初始化应用。
  3. 时间变化检测页面TimeChangeDetectorExample是一个有状态的Widget,用于显示时间是否发生变化,并提供一个按钮来重置状态。
  4. 时间变化监听:在initState方法中,添加TimeChangeDetector的监听器,当时间变化时,更新_timeChanged状态。
  5. 生命周期管理:通过WidgetsBindingObserver接口来观察应用的生命周期变化,可以在应用恢复时重新确认时间是否变化(这部分代码仅作为示例,未实际实现对比逻辑)。

这样,当用户手动更改设备时间时,应用将显示时间已经改变。你可以根据需要进一步扩展这个示例,比如添加日志记录、通知用户等。

回到顶部