android - 当我在底部导航的屏幕之间导航时,我的颤振应用程序不断重建自身
问题描述
当我尝试在底部导航的页面之间导航时,我的应用程序不断自我重建,当我尝试在用户打开应用程序时仅运行一次功能时,它成为一个问题,但我的应用程序不断重建主屏幕,我有三个屏幕,第三个屏幕没有重建,只有主屏幕,我尝试删除任何初始化状态或处置功能,看看这是否是原因但没有运气,我需要它在应用程序中停止重建这么多次,因为我有应该只运行的功能一次
import 'package:flutter/material.dart';
import 'package:hotel_search/styles/texts.dart';
import 'package:hotel_search/styles/colors.dart';
import 'package:hotel_search/widgets/result.dart';
import 'package:flutter_spinkit/flutter_spinkit.dart';
import 'package:date_range_picker/date_range_picker.dart' as DateRagePicker;
import 'package:intl/intl.dart';
import 'package:numberpicker/numberpicker.dart';
import 'package:flutter_picker/flutter_picker.dart';
import 'dart:convert';
import 'package:hotel_search/detail1.dart';
import 'package:hotel_search/common/icons.dart';
import 'package:hotel_search/common/stub_data.dart';
import 'package:hotel_search/common/theme.dart';
import 'package:hotel_search/parallax_page_view.dart';
import 'package:modal_bottom_sheet/modal_bottom_sheet.dart';
import 'package:hotel_search/splash.dart';
import 'package:splashscreen/splashscreen.dart';
import 'package:flutter/services.dart';
import 'package:custom_navigation_bar/custom_navigation_bar.dart';
import 'package:hotel_search/start.dart';
import 'package:provider/provider.dart';
import 'package:hotel_search/model.dart';
import 'package:show_up_animation/show_up_animation.dart';
import 'package:ripple_backdrop_animate_route/ripple_backdrop_animate_route.dart';
import 'package:geolocator/geolocator.dart';
import 'package:url_launcher/url_launcher.dart';
import 'package:overlay_screen/overlay_screen.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:hotel_search/FadeAnimation.dart';
import 'package:page_transition/page_transition.dart';
import 'package:animated_text_kit/animated_text_kit.dart';
import 'package:flutter_svg/flutter_svg.dart';
class HomePage extends StatefulWidget {
Home createState() => Home();
}
class Home extends State<HomePage> with TickerProviderStateMixin {
Home createState() => Home();
static bool ready = true;
final List<String> hotelCategories = StubData().hotelCategories;
final List<capitalCard> capital = StubData().capital;
final List<livingstoniaCard> livingstonia = StubData().livingstonia;
final List<mountsocheCard> mountsoche = StubData().mountsoche;
final List<mzuzuCard> mzuzu = StubData().mzuzu;
final List<lilongweCard> lilongwe = StubData().lilongwe;
final List<kuchaweCard> kuchawe = StubData().kuchawe;
final List<nkopolaCard> nkopola = StubData().nkopola;
int checkedItem = 0;
static const PickerData2 = '''
[
[
1 ,
2,
3,
4,
5,
6,
7,
8,
9,
10
],
[
1 ,
2,
3,
4,
5,
6,
7,
8,
9,
10
],
[
"Adults"
]
]
''';
static var datePicked = "Click here";
static var roomPicked = "Click here";
bool start = false;
GlobalKey<ScaffoldState> _drawerKey = GlobalKey();
@override
Widget build(BuildContext context) {
final themeData = HotelConceptThemeProvider.get();
return Scaffold(
key: _drawerKey,
drawerEdgeDragWidth: 0,
drawer: Drawer(
child: ListView(
children: <Widget>[ListTile()],
),
),
backgroundColor: Colors.white,
appBar: PreferredSize(
preferredSize: Size.fromHeight(60.0),
child: AppBar(
bottomOpacity: 0.0,
elevation: 0.0,
centerTitle: true,
backgroundColor: Colors.white,
title: Text(
"Sunbird Hotels",
style: textStyles['appBar'],
),
leading: IconButton(
onPressed: () {
_drawerKey.currentState.openDrawer();
},
icon: Icon(
Icons.menu,
color: Colors.grey[800],
),
),
actions: <Widget>[
CircleAvatar(
radius: 25,
backgroundColor: Colors.white,
child: ClipOval(
child: Image.asset(
'img/logo.jpg',
width: 34,
height: 34,
),
),
),
],
),
),
body:
解决方案
你可以做2个解决方案
1- 根据官方文档,使用 KeepAlive 类(将孩子标记为需要保持活力,即使它位于惰性列表中,否则会删除它)。
在代码中:
class YourStatefulWidget extends StatefulWidget {
//add with AutomaticKeepAliveClientMixin to the state class
class _YourStatefulWidgetState extends State<YourStatefulWidget > with AutomaticKeepAliveClientMixin {
//add super.build(context) under the build method
Widget build(BuildContext context) {
super.build(context);
return //your widget
@override
bool get wantKeepAlive => true;
}
}
}
2-使用另一个屏幕作为具有异步功能的第一个屏幕,使其等待您的功能仅运行一次以完成,然后使用 Navigator.pushReplacement 导航到您的主屏幕,这样您就可以从主屏幕中删除您的功能。
而这是通过flutter来节省内存的正常行为者。
推荐阅读
- pytorch - 使用 FP16 是否有助于加速生成?(拥抱脸巴特)
- c# - 如何单击按钮内的按钮?C# WPF
- android-studio - 为什么它显示“错误:格式不正确(无效令牌)”。在安卓工作室
- php - PHP 无法读取媒体:内容属性
- r - 如何迭代地删除值,以便在 R 中的回归中没有负面预测
- elasticsearch - elasticsearch的bulk api能保证文档写入es有序吗?
- java - Java PathMatcher 在 Windows 上无法正常工作
- javascript - 如何将javascript浏览为字符串?
- python - 如何将基于函数的数据管道转换为 OOP?
- java - 如何定义恒定增量计数器