Как мне создать приложение Flutter, основанное на времени? - PullRequest
0 голосов
/ 02 октября 2018

Мне нужно создать форму входа.После успешного входа пользователя, мне нужно запустить какой-то таймер (например, 3 минуты), поэтому, если у пользователя нет реакции на приложение или другое слово, если состояние приложения флаттера приостановлено, приостановлено или неактивно более 3 минут.приложение перейдет на главную страницу входа.Пока пользователь взаимодействует с приложением, мне нужно отменить таймер, и только мне нужно, чтобы пометить состояние приложения таймера приостановленным, приостановленным или неактивным.Как мне это сделать?

Я пытаюсь реализовать "WidgetsBindingObserver", но, похоже, он работает не так, как я хотел.Если пользователь успешно входит в систему и перемещается в приложении, WidgetsBindingObserver завершается ошибкой (ошибка: объект состояния для виджета, который больше не отображается в дереве виджетов).

Мой вопрос заключается в том, как реализовать жизненный цикл приложения, основанного на временных характеристиках, до тех пор, покапользователь имеет взаимодействие с приложением?Если нет взаимодействия с пользователем, запускается таймер жизненного цикла, и если до его окончания происходит взаимодействие с пользователем, таймер должен быть отменен.

class _MyUserHomePageState extends State<MyUserHomePage> with WidgetsBindingObserver {

  AppLifecycleState _appLifecycleState;



@override
void initState() {
  _appStatePasue = false;
  WidgetsBinding.instance.addObserver(this);
  super.initState();
}


// TODO: DID_CHANGE_APP_LIFE_CYCLE
void didChangeAppLifecycleState(AppLifecycleState state) {
  setState(() {
    _appLifecycleState = state;
    if(_appLifecycleState == AppLifecycleState.paused ||
        _appLifecycleState == AppLifecycleState.inactive ||
        _appLifecycleState == AppLifecycleState.suspending) {
      _appStatePasue = true;
      print("timer---fired: $_appLifecycleState");
      _timer = Timer.periodic(Duration(minutes: 1), _capitalCallback);
      print(_appLifecycleState);
    } else {
      _appStatePasue = false;
    }
  });
}

// TODO: APP_LIFE_CYCLE__CALLBACK
void _capitalCallback(_timer) {
  if(_appStatePasue == true) {
    _timer.cancel();
    print("return---main---page: $_appLifecycleState");
    setState(() {
      Navigator.push(
          context,
          SlideRightRoute(widget: MyApp())
      );
    });
  } else {
    _timer.cancel();
    print("timer---canceled: $_appLifecycleState");
  }
}


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

@override
void onDeactivate() {
  super.deactivate();
}

@override
Widget build(BuildContext context) {
    return new Scaffold (

    );
}

}

1 Ответ

0 голосов
/ 02 октября 2018

Вы можете использовать класс Timer для запуска функции выхода из системы после 3 минут бездействия.Вы можете попробовать обернуть все приложение в GestureDetector, который сбрасывает таймер при любом событии.Вам просто нужно убедиться, что любые другие GestureDetector в вашем приложении используют HitTestBehavior.translucent, чтобы события передавались вашему корневому слушателю.Вот полный пример:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) => AppRoot();
}

class AppRoot extends StatefulWidget {
  @override
  AppRootState createState() => AppRootState();
}

class AppRootState extends State<AppRoot> {
  Timer _timer;

  @override
  void initState() {
    super.initState();

    _initializeTimer();
  }

  void _initializeTimer() {
    _timer = Timer.periodic(const Duration(minutes: 3), (_) => _logOutUser);
  }

  void _logOutUser() {
    // Log out the user if they're logged in, then cancel the timer.
    // You'll have to make sure to cancel the timer if the user manually logs out
    //   and to call _initializeTimer once the user logs in
    _timer.cancel();
  }

  // You'll probably want to wrap this function in a debounce
  void _handleUserInteraction([_]) {
    if (!_timer.isActive) {
      // This means the user has been logged out
      return;
    }

    _timer.cancel();
    _initializeTimer();
  }

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: _handleUserInteraction,
      onPanDown: _handleUserInteraction,
      onScaleStart: _handleUserInteraction,
      // ... repeat this for all gesture events
      child: MaterialApp(
        // ... from here it's just your normal app,
        // Remember that any GestureDetector within your app must have
        //   HitTestBehavior.translucent
      ),
    );
  }
}

ОБНОВЛЕНИЕ: я только что обнаружил класс Listener , который может иметь больше смысла, чем GestureDetector.Я лично никогда не использовал это, но не стесняйтесь экспериментировать!Проверьте документацию по жестам для получения дополнительной информации.

...