首页 > 解决方案 > 当我在底部导航的屏幕之间导航时,我的颤振应用程序不断重建自身

问题描述

当我尝试在底部导航的页面之间导航时,我的应用程序不断自我重建,当我尝试在用户打开应用程序时仅运行一次功能时,它成为一个问题,但我的应用程序不断重建主屏幕,我有三个屏幕,第三个屏幕没有重建,只有主屏幕,我尝试删除任何初始化状态或处置功能,看看这是否是原因但没有运气,我需要它在应用程序中停止重建这么多次,因为我有应该只运行的功能一次

    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:

标签: androidflutterdart

解决方案


你可以做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来节省内存的正常行为者。


推荐阅读