当前位置:网站首页>Solution qui ne peut pas être retournée après la mise à jour du navigateur Web flutter
Solution qui ne peut pas être retournée après la mise à jour du navigateur Web flutter
2022-07-06 17:40:00 【Le Code n'est pas difficile à écrire】
Questions
InFlutterTemps d'exécution de la page Web développée,Après que le navigateur a mis à jour la page,Bien que la page avant rafraîchissement soit affichée(Si vous sautez avec un routage statique),Mais à ce moment - làNavigator.popLa méthode ne peut pas revenir à la page précédente,L'inclusion d'un clic sur le bouton retour du navigateur est également invalide(Dans la barre d'adresseurlÇa va changer.,La page ne change pas).
Raisons
Quand le navigateur se rafraîchit,FlutterLe moteur va redémarrer,Et charger la page courante,C'est - à - dire,Après rafraîchissementFlutterToutes les variables statiques en mémoire sont initialisées,Aucun enregistrement de page précédent n'a été conservé dans la pile de page,Seulement la page actuelle.C'est comme naviguer sur le Web,Copier l'URL d'une des pages,Ouvrir à nouveau dans un nouvel onglet.
Solutions
(Un.)Idées
Savoir pourquoi,Juste une solution ciblée.Enregistrement de la pile de page manquant,Maintenez une pile de rechange dans votre code,Écouter le routage de la page,Chaque fois que vous accédez à une nouvelle page,Enregistrer la page couranteURL,À la sortie,Supprimer l'enregistrementURL,Lorsque l'enregistrement de la pile de rafraîchissement du navigateur échoue,Aide retour à la page précédente.
(2.)Avantages et inconvénients du programme
Avantages: Il n'y a pas d'exception à l'effet de recul,AppelezNavigator.popLa méthode ou cliquer sur le bouton de retour du navigateur prend en charge;
Inconvénients: Navigator.pushName().thenLe rappel pour ne pas prendre effet,Parce que c'est la page précédente régénérée,Donc le rappel n'est pas appelé;.Toutes les données temporaires de la page retournée disparaîtront,Comme le contenu de la boîte d'entrée,Variables des membres, etc.; Le saut doit être acheminé statiquement , Et passer le ginseng UriLe paquet, Impossible de passer le paramètre avec le constructeur .
Réalisation
1. Web Outils de stockage locaux —localStorage
localStorageOui.htmlSous le sac.window Un objet de stockage dans ,Parkey、valueStockage sous forme de
// Sac de guidage
import 'dart:html' as html;
// Comment utiliser
html.window.localStorage["key"] = "value"
L'emballage des outils de stockage n'est pas écrit ici , Encapsulation en fonction de la réalisation de l'entreprise , Il suffit d'appeler commodément .
2. Classe d'outils d'enregistrement de pile RouterHistory
C'est un outil d'enregistrement de pile , La fonction principale est d'enregistrer l'écoute , Ajouter supprimer les enregistrements, etc .
/// DB() Pour une base de données locale encapsulée
class RouterHistory {
/// Écoutez les rappels avant de rafraîchir votre navigateur
static Function(html.Event event)? _beforeUnload;
/// Écouter les rappels lorsque le navigateur recule
static Function(html.Event event)? _popState;
/// La page actuelle a - t - elle été mise à jour
static bool isRefresh = false;
/// Initialisation et enregistrement de l'écoute
static void register() {
// Rappel lors du rafraîchissement
_beforeUnload = (event) {
// Enregistrement local ,Marqué comme"Rafraîchi"
DB(DBKey.isRefresh).value = true;
// Supprimer l'écoute de l'instance avant le rafraîchissement
html.window.removeEventListener('beforeunload', _beforeUnload);
html.window.removeEventListener('popstate', _popState);
};
// Rappel du bouton de recul du navigateur
_popState = (event) {
// La page est rafraîchie , Déclenche un rappel de secours
if (isRefresh) {
_back(R.currentContext); //R.currentContext Pour la page couranteContext
}
};
// Ajouter un moniteur
html.window.addEventListener('beforeunload', _beforeUnload);
html.window.addEventListener('popstate', _popState);
// Extrait de la base de données locale "Rafraîchir"Marquage
isRefresh = DB(DBKey.isRefresh).get(false);
// Si elle n'est pas rafraîchie , Effacer l'historique de la dernière pile de rechange
if (!isRefresh) {
clean();
}
// Restaurer les balises de rafraîchissement dans la bibliothèque locale
DB(DBKey.isRefresh).value = false;
}
static bool checkBack(currentContext) {
// Est - ce normal? pop
if (Navigator.canPop(currentContext)) {
return true;
}
// Impossible d'activer la pile de rechange
_back(currentContext);
return false;
}
// Retour
static void _back(currentContext) {
List history = get();
if (history.length > 1) {
history.removeLast();
set(history);
// Passez à la page précédente et fermez la page courante
Navigator.of(currentContext).popAndPushNamed(history.last);
}
}
// Ajouter un enregistrement
static add(String? path) {
if (path == null) return;
List history = get();
if (history.contains(path)) return;
history.add(path);
set(history);
}
// Supprimer l'enregistrement
static remove(String? path) {
if (path == null) return;
List history = get();
history.remove(path);
set(history);
}
// Définir des données de pile de rechange
static String set(List<dynamic> history) => DB(DBKey.history).value = json.encode(history);
// Extraire les données de pile de rechange
static get() => json.decode(DB(DBKey.history).get('[]'));
// Effacer la pile de rechange
static clean() => DB(DBKey.history).value = '[]';
}
3. ÉcouterFlutterRoutage
Personnaliser les classes et implémenter NavigatorObserver, Et mettre la classe d'implémentation dans MaterialAppDansnavigatorObserversDans les paramètres.
// Catégorie de mise en œuvre
class HistoryObs extends NavigatorObserver {
@override
void didPush(Route<dynamic> route, Route<dynamic>? previousRoute) {
// Enregistrer les informations de routage
RouterHistory.add(route.settings.name);
}
@override
void didPop(Route<dynamic> route, Route<dynamic>? previousRoute) {
// Supprimer les informations de routage
RouterHistory.remove(route.settings.name);
}
}
// Configuration de l'écoute
MaterialApp(
......
navigatorObservers: [ HistoryObs() ],
......
)
4. Méthode de routage encapsulée
La méthode de saut doit être statique , Pour s'assurer que les paramètres et les chemins peuvent être urlMoyenne, Pour obtenir un effet de recul
/// Remplacer Navigator.pop ,
static pop() {
// Vérifier si le retour normal est possible ,Impossible de retournerFALSE
if (RouterHistory.checkBack(currentContext)) {
Navigator.pop(currentContext);
}
}
/// Saut de routage statique
static Future toName(String pageName, {Map<String, dynamic>? params}) {
// Chemin d'encapsulation et paramètres
var uri = Uri(scheme: RoutePath.scheme, host: pageName, queryParameters: params ?? {});
return Navigator.of(currentContext).pushNamed(uri.toString());
}
5. Initialisation de l'emplacement
Mettez - le surMaterialAppL'extérieurbuildMoyenne,OuinitStateJuste au milieu.
@override
void initState() {
super.initState();
RouterHistory.register();
}
@override
Widget build(BuildContext context) {
// Ou RouterHistory.register();
return MaterialApp(
navigatorObservers: [MiddleWare()],
);
}
Ce sont les codes clés du programme
Enfin
Cette solution résout simplement le problème , Mais ce n'est pas la meilleure solution . Il y a de meilleures solutions pour accueillir les messages ~
FlutterOfficialNavigator 2.0 Bien qu'il soit possible d'obtenir un retour en arrière , C'est essentiellement un saut vers une nouvelle page , Et a causé la confusion des enregistrements dans la pile , Ça ne peut pas être comme webC'est pareil, Les étudiants intéressés peuvent apprendre par eux - mêmes Navigator 2.0.
Navigator2.0 Dans le traitement du bouton de recul du navigateur avec Navigator1.0C'est différent., En appuyant sur le bouton arrière Navigator2.0 Ce n'est pas l'exécution popFonctionnement,C'est l'exécution.setNewRoutePathFonctionnement, C'est censé provenir d'un navigateur history Pour obtenir la page précédente url,Puis rechargez. Cela résout vraiment le problème de la retraite après rafraîchissement , Parce que rafraîchir le navigateur historyPas perdu, Mais cela a aussi conduit à ce que nous avons mentionné dans l'article flutter Problèmes de pile de pages chaotiques dans .
Si votre chemin vers l'avant manque de direction, Vous pouvez scanner le Code QR ci - dessous pour rejoindre notre cercle et apprendre à communiquer avec les développeurs Android !
- Tout ce qui suit est disponible sur WeChat !
AndroidManuel complet pour l'apprentissage avancé
AndroidComparer AliP7Apprendre la vidéo
BATJGrande usineAndroidQuestions d'entrevue à haute fréquence
Auteur: Sue Bowman.
Liens:https://juejin.cn/post/7114848130004156446
边栏推荐
- Distributed (consistency protocol) leader election (dotnext.net.cluster implements raft election)
- 【逆向中级】跃跃欲试
- Based on infragistics Document. Excel export table class
- [CISCN 2021 华南赛区]rsa Writeup
- Single responsibility principle
- Deploy flask project based on LNMP
- 虚拟机启动提示Probing EDD (edd=off to disable)错误
- 【ASM】字节码操作 ClassWriter 类介绍与使用
- BearPi-HM_ Nano development board "flower protector" case
- How uipath determines that an object is null
猜你喜欢
[rapid environment construction] openharmony 10 minute tutorial (cub pie)
虚拟机启动提示Probing EDD (edd=off to disable)错误
The most complete tcpdump and Wireshark packet capturing practice in the whole network
RepPoints:可形变卷积的进阶
Flink parsing (VII): time window
Garbage first of JVM garbage collector
信息与网络安全期末复习(基于老师给的重点)
BearPi-HM_ Nano development environment
Deploy flask project based on LNMP
TCP连接不止用TCP协议沟通
随机推荐
Re signal writeup
05个人研发的产品及推广-数据同步工具
C # nanoframework lighting and key esp32
yarn : 无法加载文件 D:\ProgramFiles\nodejs\yarn.ps1,因为在此系统上禁止运行脚本
Application service configurator (regular, database backup, file backup, remote backup)
Deploy flask project based on LNMP
PySpark算子处理空间数据全解析(5): 如何在PySpark里面使用空间运算接口
虚拟机启动提示Probing EDD (edd=off to disable)错误
轻量级计划服务工具研发与实践
Selenium test of automatic answer runs directly in the browser, just like real users.
关于Selenium启动Chrome浏览器闪退问题
Redis installation on centos7
Remote code execution penetration test - B module test
MySQL basic addition, deletion, modification and query of SQL statements
Debug and run the first xv6 program
Flexible report v1.0 (simple version)
07个人研发的产品及推广-人力资源信息管理系统
Detailed explanation of data types of MySQL columns
Huawei certified cloud computing hica
Total / statistics function of MySQL