当前位置: 首页 > 知识库问答 >
问题:

Firebase退出打瞌睡模式后无法重新连接

齐运诚
2023-03-14

进入Androids的Doze模式(锁定屏幕,运行adb shell dumpsys电池拔出,然后运行adb shell dumpsys deviceidle Force-Idle)

几秒钟/分钟后,在“运行”选项卡下,将出现以下内容:

流关闭,状态为:Status{code=unavailable,description=keepalive失败。连接可能已消失,原因=null}。[{0}]无法解析名称。状态={1}

捕获的异常是:MyDatabase getDatabaselData[cloud_firestore/unavailable]服务当前不可用。

pubspec.yaml

cloud_firestore: ^0.14.1+3
firebase_storage: ^4.0.1
firebase_core: ^0.5.0+1
firebase_auth: ^0.18.3

共有1个答案

申屠恺
2023-03-14

编辑2:在编写此编辑时,FlutterFire git上有一个提交挂起(但尚未发布)。因此,解决方案将是更新到最新的Firebase_Core。也可以在Firebase_Core包>gradle.properties>将firebasesdkversion=28.0.1改为firebasesdkversion=28.1.0中手动修复。

编辑:如果手机自然进入状态(6小时完全不活动),问题仍然存在。这个问题似乎必须在FirebaseSDK内部解决,但到目前为止还没有解决:https://github.com/firebaseExtended/flutterfire/issues/4305

老答:

这是代码;创建一个生命周期管理器类(观察者),并将其环绕在您的MaterialApp周围。试捕可能是没有必要的,但我将推动生产明天,所以这只是一个预防措施。

lifecycle_manager.dart

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

class LifecycleManager extends StatefulWidget {
  final Widget child;
  LifecycleManager({Key key, this.child}) : super(key: key);
  @override
  _LifecycleManagerState createState() => _LifecycleManagerState();
}

class _LifecycleManagerState extends State<LifecycleManager> with WidgetsBindingObserver {
  @override
  Widget build(BuildContext context) {
    return widget.child;
  }

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

  @override
  void dispose() {
    super.dispose();
    WidgetsBinding.instance.removeObserver(this);
  }

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    super.didChangeAppLifecycleState(state);
    try {
      if (state != AppLifecycleState.resumed) FirebaseFirestore.instance.disableNetwork();
      else FirebaseFirestore.instance.enableNetwork();
    } catch (error) {
      print('LifecycleManager | didChangeAppLifecycleState | ' + error.toString());
    }
  }
}

主飞镖

import 'lifecycle_manager.dart';
LifecycleManager(child: MaterialApp());
 类似资料: