Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 每次我重新进入页面时都会调用flatter initState_Flutter_State_Navigation Drawer - Fatal编程技术网

Flutter 每次我重新进入页面时都会调用flatter initState

Flutter 每次我重新进入页面时都会调用flatter initState,flutter,state,navigation-drawer,Flutter,State,Navigation Drawer,我有三页,A,B,C,我通过抽屉在它们之间导航 我的目标是使initState只被调用一次(当页面插入小部件树时),这样当我返回到它时,每个页面的状态就不会被重新初始化。 我的第一次尝试是使用Navigator.of(context).PushNamed(routeName),如下面的代码所示。 可能这不起作用,因为如果我从A调用B,然后再调用A,那么导航器堆栈是 [A] -->[B,A]-->[A,B,A]而不是 [A] ->[B,A]-->[A] 因此,基于pop()的导航应该更合适。我试过

我有三页,A,B,C,我通过抽屉在它们之间导航

我的目标是使initState只被调用一次(当页面插入小部件树时),这样当我返回到它时,每个页面的状态就不会被重新初始化。

我的第一次尝试是使用
Navigator.of(context).PushNamed(routeName)
,如下面的代码所示。 可能这不起作用,因为如果我从A调用B,然后再调用A,那么导航器堆栈是

[A] -->[B,A]-->[A,B,A]而不是

[A] ->[B,A]-->[A]

因此,基于pop()的导航应该更合适。我试过了

onTap: () {
              Navigator.of(context).canPop()
                  ? Navigator.of(context)
                      .popUntil(ModalRoute.withName(PageA.routeName))
                  : Navigator.of(context).pushNamed(PageA.routeName);
            },
而不是
onTap:()=>Navigator.of(context).pushNamed(PageA.routeName)
但它不起作用:当我点击抽屉里的物品时,会出现一个黑屏,没有任何异常或警告,好像导航器调用了一个黑屏

我做错了什么?知道怎么修理吗

这是我的代码:

main.dart

import 'package:flutter/material.dart';
import 'page_c.dart';
import 'page_a.dart';
import 'page_b.dart';
void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Navigation test',
      home: PageA(),
      routes: {
        PageA.routeName: (ctx) => PageA(),
        PageB.routeName: (ctx) => PageB(),
        PageC.routeName: (ctx) => PageC(),
      },
    );
  }
}
import 'package:flutter/material.dart';
import 'page_b.dart';
import 'page_c.dart';
import 'page_a.dart';

class MyDrawer extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Drawer(
      child: Column(
        children: [
          SizedBox(
            height: 100,
          ),
          ListTile(
              title: Text('PAGE A'),
              onTap: () => Navigator.of(context).pushNamed(PageA.routeName)),
          ListTile(
              title: Text('PAGE B'),
              onTap: () => Navigator.of(context).pushNamed(PageB.routeName)),
          ListTile(
              title: Text('PAGE C'),
              onTap: () => Navigator.of(context).pushNamed(PageC.routeName)),
        ],
      ),
    );
  }
}
import 'package:flutter/material.dart';
import 'my_drawer.dart';

class PageA extends StatefulWidget {
  static const routeName = '/route-a';

  @override
  _PageAState createState() => _PageAState();
}

class _PageAState extends State<PageA> {
  @override
  void initState() {
    print('PAGE A INIT STATE');
    super.initState();
  }

  // void didChangeDependencies() {
  //   print('PAGE A DID CHANGE DEPENDECIES');
  //   super.didChangeDependencies();
  // }

  // @override
  // void dispose() {
  //   print('PAGE A DISPOSE');
  //   super.dispose();
  // }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('PAGE A')),
      drawer: MyDrawer(),
      body: Center(
        child: Text('A', style: TextStyle(fontSize: 100)),
      ),
    );
  }
}
import 'package:flutter/material.dart';
import 'my_drawer.dart';

class PageB extends StatefulWidget {
  static const routeName = '/route-b';

  @override
  _PageBState createState() => _PageBState();
}

class _PageBState extends State<PageB> {
  @override
  void initState() {
    print('PAGE B INIT STATE');
    super.initState();
  }

  // void didChangeDependencies() {
  //   print('PAGE B DID CHANGE DEPENDECIES');
  //   super.didChangeDependencies();
  // }

  // @override
  // void dispose() {
  //   print('PAGE B DISPOSE');
  //   super.dispose();
  // }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('PAGE B')),
      drawer: MyDrawer(),
      body: Center(
        child: Text('B', style: TextStyle(fontSize: 100)),
      ),
    );
  }
}
import 'package:flutter/material.dart';
import 'my_drawer.dart';

class PageC extends StatefulWidget {
  static const routeName = '/route-c';

  @override
  _PageCState createState() => _PageCState();
}

class _PageCState extends State<PageC> {
  @override
  void initState() {
    print('PAGE C INIT STATE');
    super.initState();
  }

  // void didChangeDependencies() {
  //   print('PAGE C DID CHANGE DEPENDECIES');
  //   super.didChangeDependencies();
  // }

  // @override
  // void dispose() {
  //   print('PAGE C DISPOSE');
  //   super.dispose();
  // }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('PAGE C')),
      drawer: MyDrawer(),
      body: Center(
        child: Text('C', style: TextStyle(fontSize: 100)),
      ),
    );
  }
}
我的抽屉。飞镖

import 'package:flutter/material.dart';
import 'page_c.dart';
import 'page_a.dart';
import 'page_b.dart';
void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Navigation test',
      home: PageA(),
      routes: {
        PageA.routeName: (ctx) => PageA(),
        PageB.routeName: (ctx) => PageB(),
        PageC.routeName: (ctx) => PageC(),
      },
    );
  }
}
import 'package:flutter/material.dart';
import 'page_b.dart';
import 'page_c.dart';
import 'page_a.dart';

class MyDrawer extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Drawer(
      child: Column(
        children: [
          SizedBox(
            height: 100,
          ),
          ListTile(
              title: Text('PAGE A'),
              onTap: () => Navigator.of(context).pushNamed(PageA.routeName)),
          ListTile(
              title: Text('PAGE B'),
              onTap: () => Navigator.of(context).pushNamed(PageB.routeName)),
          ListTile(
              title: Text('PAGE C'),
              onTap: () => Navigator.of(context).pushNamed(PageC.routeName)),
        ],
      ),
    );
  }
}
import 'package:flutter/material.dart';
import 'my_drawer.dart';

class PageA extends StatefulWidget {
  static const routeName = '/route-a';

  @override
  _PageAState createState() => _PageAState();
}

class _PageAState extends State<PageA> {
  @override
  void initState() {
    print('PAGE A INIT STATE');
    super.initState();
  }

  // void didChangeDependencies() {
  //   print('PAGE A DID CHANGE DEPENDECIES');
  //   super.didChangeDependencies();
  // }

  // @override
  // void dispose() {
  //   print('PAGE A DISPOSE');
  //   super.dispose();
  // }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('PAGE A')),
      drawer: MyDrawer(),
      body: Center(
        child: Text('A', style: TextStyle(fontSize: 100)),
      ),
    );
  }
}
import 'package:flutter/material.dart';
import 'my_drawer.dart';

class PageB extends StatefulWidget {
  static const routeName = '/route-b';

  @override
  _PageBState createState() => _PageBState();
}

class _PageBState extends State<PageB> {
  @override
  void initState() {
    print('PAGE B INIT STATE');
    super.initState();
  }

  // void didChangeDependencies() {
  //   print('PAGE B DID CHANGE DEPENDECIES');
  //   super.didChangeDependencies();
  // }

  // @override
  // void dispose() {
  //   print('PAGE B DISPOSE');
  //   super.dispose();
  // }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('PAGE B')),
      drawer: MyDrawer(),
      body: Center(
        child: Text('B', style: TextStyle(fontSize: 100)),
      ),
    );
  }
}
import 'package:flutter/material.dart';
import 'my_drawer.dart';

class PageC extends StatefulWidget {
  static const routeName = '/route-c';

  @override
  _PageCState createState() => _PageCState();
}

class _PageCState extends State<PageC> {
  @override
  void initState() {
    print('PAGE C INIT STATE');
    super.initState();
  }

  // void didChangeDependencies() {
  //   print('PAGE C DID CHANGE DEPENDECIES');
  //   super.didChangeDependencies();
  // }

  // @override
  // void dispose() {
  //   print('PAGE C DISPOSE');
  //   super.dispose();
  // }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('PAGE C')),
      drawer: MyDrawer(),
      body: Center(
        child: Text('C', style: TextStyle(fontSize: 100)),
      ),
    );
  }
}
页码a.省道

import 'package:flutter/material.dart';
import 'page_c.dart';
import 'page_a.dart';
import 'page_b.dart';
void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Navigation test',
      home: PageA(),
      routes: {
        PageA.routeName: (ctx) => PageA(),
        PageB.routeName: (ctx) => PageB(),
        PageC.routeName: (ctx) => PageC(),
      },
    );
  }
}
import 'package:flutter/material.dart';
import 'page_b.dart';
import 'page_c.dart';
import 'page_a.dart';

class MyDrawer extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Drawer(
      child: Column(
        children: [
          SizedBox(
            height: 100,
          ),
          ListTile(
              title: Text('PAGE A'),
              onTap: () => Navigator.of(context).pushNamed(PageA.routeName)),
          ListTile(
              title: Text('PAGE B'),
              onTap: () => Navigator.of(context).pushNamed(PageB.routeName)),
          ListTile(
              title: Text('PAGE C'),
              onTap: () => Navigator.of(context).pushNamed(PageC.routeName)),
        ],
      ),
    );
  }
}
import 'package:flutter/material.dart';
import 'my_drawer.dart';

class PageA extends StatefulWidget {
  static const routeName = '/route-a';

  @override
  _PageAState createState() => _PageAState();
}

class _PageAState extends State<PageA> {
  @override
  void initState() {
    print('PAGE A INIT STATE');
    super.initState();
  }

  // void didChangeDependencies() {
  //   print('PAGE A DID CHANGE DEPENDECIES');
  //   super.didChangeDependencies();
  // }

  // @override
  // void dispose() {
  //   print('PAGE A DISPOSE');
  //   super.dispose();
  // }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('PAGE A')),
      drawer: MyDrawer(),
      body: Center(
        child: Text('A', style: TextStyle(fontSize: 100)),
      ),
    );
  }
}
import 'package:flutter/material.dart';
import 'my_drawer.dart';

class PageB extends StatefulWidget {
  static const routeName = '/route-b';

  @override
  _PageBState createState() => _PageBState();
}

class _PageBState extends State<PageB> {
  @override
  void initState() {
    print('PAGE B INIT STATE');
    super.initState();
  }

  // void didChangeDependencies() {
  //   print('PAGE B DID CHANGE DEPENDECIES');
  //   super.didChangeDependencies();
  // }

  // @override
  // void dispose() {
  //   print('PAGE B DISPOSE');
  //   super.dispose();
  // }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('PAGE B')),
      drawer: MyDrawer(),
      body: Center(
        child: Text('B', style: TextStyle(fontSize: 100)),
      ),
    );
  }
}
import 'package:flutter/material.dart';
import 'my_drawer.dart';

class PageC extends StatefulWidget {
  static const routeName = '/route-c';

  @override
  _PageCState createState() => _PageCState();
}

class _PageCState extends State<PageC> {
  @override
  void initState() {
    print('PAGE C INIT STATE');
    super.initState();
  }

  // void didChangeDependencies() {
  //   print('PAGE C DID CHANGE DEPENDECIES');
  //   super.didChangeDependencies();
  // }

  // @override
  // void dispose() {
  //   print('PAGE C DISPOSE');
  //   super.dispose();
  // }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('PAGE C')),
      drawer: MyDrawer(),
      body: Center(
        child: Text('C', style: TextStyle(fontSize: 100)),
      ),
    );
  }
}
导入“包装:颤振/材料.省道”;
导入“my_drawer.dart”;
类PageA扩展了StatefulWidget{
静态常量routeName='/route-a';
@凌驾
_PageAState createState()=>\u PageAState();
}
类_PageAState扩展状态{
@凌驾
void initState(){
打印(“页面A初始状态”);
super.initState();
}
//void didChangeDependencies(){
//打印(“A页未更改依赖项”);
//super.didChangeDependencies();
// }
//@覆盖
//无效处置(){
//打印(A页);
//super.dispose();
// }
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(标题:文本(“A页”),
抽屉:MyDrawer(),
正文:中(
子项:文本('A',样式:TextStyle(fontSize:100)),
),
);
}
}
省道页面

import 'package:flutter/material.dart';
import 'page_c.dart';
import 'page_a.dart';
import 'page_b.dart';
void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Navigation test',
      home: PageA(),
      routes: {
        PageA.routeName: (ctx) => PageA(),
        PageB.routeName: (ctx) => PageB(),
        PageC.routeName: (ctx) => PageC(),
      },
    );
  }
}
import 'package:flutter/material.dart';
import 'page_b.dart';
import 'page_c.dart';
import 'page_a.dart';

class MyDrawer extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Drawer(
      child: Column(
        children: [
          SizedBox(
            height: 100,
          ),
          ListTile(
              title: Text('PAGE A'),
              onTap: () => Navigator.of(context).pushNamed(PageA.routeName)),
          ListTile(
              title: Text('PAGE B'),
              onTap: () => Navigator.of(context).pushNamed(PageB.routeName)),
          ListTile(
              title: Text('PAGE C'),
              onTap: () => Navigator.of(context).pushNamed(PageC.routeName)),
        ],
      ),
    );
  }
}
import 'package:flutter/material.dart';
import 'my_drawer.dart';

class PageA extends StatefulWidget {
  static const routeName = '/route-a';

  @override
  _PageAState createState() => _PageAState();
}

class _PageAState extends State<PageA> {
  @override
  void initState() {
    print('PAGE A INIT STATE');
    super.initState();
  }

  // void didChangeDependencies() {
  //   print('PAGE A DID CHANGE DEPENDECIES');
  //   super.didChangeDependencies();
  // }

  // @override
  // void dispose() {
  //   print('PAGE A DISPOSE');
  //   super.dispose();
  // }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('PAGE A')),
      drawer: MyDrawer(),
      body: Center(
        child: Text('A', style: TextStyle(fontSize: 100)),
      ),
    );
  }
}
import 'package:flutter/material.dart';
import 'my_drawer.dart';

class PageB extends StatefulWidget {
  static const routeName = '/route-b';

  @override
  _PageBState createState() => _PageBState();
}

class _PageBState extends State<PageB> {
  @override
  void initState() {
    print('PAGE B INIT STATE');
    super.initState();
  }

  // void didChangeDependencies() {
  //   print('PAGE B DID CHANGE DEPENDECIES');
  //   super.didChangeDependencies();
  // }

  // @override
  // void dispose() {
  //   print('PAGE B DISPOSE');
  //   super.dispose();
  // }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('PAGE B')),
      drawer: MyDrawer(),
      body: Center(
        child: Text('B', style: TextStyle(fontSize: 100)),
      ),
    );
  }
}
import 'package:flutter/material.dart';
import 'my_drawer.dart';

class PageC extends StatefulWidget {
  static const routeName = '/route-c';

  @override
  _PageCState createState() => _PageCState();
}

class _PageCState extends State<PageC> {
  @override
  void initState() {
    print('PAGE C INIT STATE');
    super.initState();
  }

  // void didChangeDependencies() {
  //   print('PAGE C DID CHANGE DEPENDECIES');
  //   super.didChangeDependencies();
  // }

  // @override
  // void dispose() {
  //   print('PAGE C DISPOSE');
  //   super.dispose();
  // }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('PAGE C')),
      drawer: MyDrawer(),
      body: Center(
        child: Text('C', style: TextStyle(fontSize: 100)),
      ),
    );
  }
}
导入“包装:颤振/材料.省道”;
导入“my_drawer.dart”;
类PageB扩展了StatefulWidget{
静态常量routeName='/route-b';
@凌驾
_PageBState createState()=>\u PageBState();
}
类_PageBState扩展状态{
@凌驾
void initState(){
打印(“页面B初始状态”);
super.initState();
}
//void didChangeDependencies(){
//打印(“B页未更改依赖项”);
//super.didChangeDependencies();
// }
//@覆盖
//无效处置(){
//打印(第B页);
//super.dispose();
// }
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(标题:文本(“B页”),
抽屉:MyDrawer(),
正文:中(
子项:文本('B',样式:文本样式(fontSize:100)),
),
);
}
}
第三页省道

import 'package:flutter/material.dart';
import 'page_c.dart';
import 'page_a.dart';
import 'page_b.dart';
void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Navigation test',
      home: PageA(),
      routes: {
        PageA.routeName: (ctx) => PageA(),
        PageB.routeName: (ctx) => PageB(),
        PageC.routeName: (ctx) => PageC(),
      },
    );
  }
}
import 'package:flutter/material.dart';
import 'page_b.dart';
import 'page_c.dart';
import 'page_a.dart';

class MyDrawer extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Drawer(
      child: Column(
        children: [
          SizedBox(
            height: 100,
          ),
          ListTile(
              title: Text('PAGE A'),
              onTap: () => Navigator.of(context).pushNamed(PageA.routeName)),
          ListTile(
              title: Text('PAGE B'),
              onTap: () => Navigator.of(context).pushNamed(PageB.routeName)),
          ListTile(
              title: Text('PAGE C'),
              onTap: () => Navigator.of(context).pushNamed(PageC.routeName)),
        ],
      ),
    );
  }
}
import 'package:flutter/material.dart';
import 'my_drawer.dart';

class PageA extends StatefulWidget {
  static const routeName = '/route-a';

  @override
  _PageAState createState() => _PageAState();
}

class _PageAState extends State<PageA> {
  @override
  void initState() {
    print('PAGE A INIT STATE');
    super.initState();
  }

  // void didChangeDependencies() {
  //   print('PAGE A DID CHANGE DEPENDECIES');
  //   super.didChangeDependencies();
  // }

  // @override
  // void dispose() {
  //   print('PAGE A DISPOSE');
  //   super.dispose();
  // }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('PAGE A')),
      drawer: MyDrawer(),
      body: Center(
        child: Text('A', style: TextStyle(fontSize: 100)),
      ),
    );
  }
}
import 'package:flutter/material.dart';
import 'my_drawer.dart';

class PageB extends StatefulWidget {
  static const routeName = '/route-b';

  @override
  _PageBState createState() => _PageBState();
}

class _PageBState extends State<PageB> {
  @override
  void initState() {
    print('PAGE B INIT STATE');
    super.initState();
  }

  // void didChangeDependencies() {
  //   print('PAGE B DID CHANGE DEPENDECIES');
  //   super.didChangeDependencies();
  // }

  // @override
  // void dispose() {
  //   print('PAGE B DISPOSE');
  //   super.dispose();
  // }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('PAGE B')),
      drawer: MyDrawer(),
      body: Center(
        child: Text('B', style: TextStyle(fontSize: 100)),
      ),
    );
  }
}
import 'package:flutter/material.dart';
import 'my_drawer.dart';

class PageC extends StatefulWidget {
  static const routeName = '/route-c';

  @override
  _PageCState createState() => _PageCState();
}

class _PageCState extends State<PageC> {
  @override
  void initState() {
    print('PAGE C INIT STATE');
    super.initState();
  }

  // void didChangeDependencies() {
  //   print('PAGE C DID CHANGE DEPENDECIES');
  //   super.didChangeDependencies();
  // }

  // @override
  // void dispose() {
  //   print('PAGE C DISPOSE');
  //   super.dispose();
  // }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('PAGE C')),
      drawer: MyDrawer(),
      body: Center(
        child: Text('C', style: TextStyle(fontSize: 100)),
      ),
    );
  }
}
导入“包装:颤振/材料.省道”;
导入“my_drawer.dart”;
类PageC扩展了StatefulWidget{
静态常量routeName='/route-c';
@凌驾
_PageCState createState()=>\u PageCState();
}
类_PageCState扩展状态{
@凌驾
void initState(){
打印(“第C页初始状态”);
super.initState();
}
//void didChangeDependencies(){
//打印(“C页未更改依赖项”);
//super.didChangeDependencies();
// }
//@覆盖
//无效处置(){
//打印(C页);
//super.dispose();
// }
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(标题:文本(“C页”),
抽屉:MyDrawer(),
正文:中(
子项:文本('C',样式:TextStyle(fontSize:100)),
),
);
}
}

navigator的pushNamed方法在每次调用页面时为其创建一个新实例,这是正常的。如果你想保持你的页面状态,我认为你应该在一个容器中显示/隐藏你的页面。导航器的pushNamed方法在你每次调用它时都会为你的页面创建一个新的实例,这很正常。如果你想保持你的页面状态,我认为你应该在一个容器中显示/隐藏你的页面。