当前位置: 首页 > 面试题库 >

Flutter上的小部件的onResume()和onPause()

宇文俊明
2023-03-14
问题内容

现在,小部件仅具有initeState()
和dispose(),该initeState()在第一次创建小部件时被触发,而dispose()在小部件
被破坏时被触发。有没有一种方法可以检测小部件何时回到
前台?当一个小部件由于另一个
小部件刚刚被前景显示而将要进入后台时?这等效
于Android触发onResume和onPause ,以及ios触发viewWillAppear和viewWillDisappear


问题答案:

最常见的情况是,如果您正在运行动画并且不想在后台消耗资源。在这种情况下,你应该延长您的State使用TickerProviderStateMixin,并使用你的State作为vsync的说法AnimationController。当您State可见时,Flutter 只会处理动画控制器的侦听器。

如果你想State住在你的S PageRoute当被置于PageRoute被其他内容遮挡,可以传递的参数,以您的构造函数。如果执行此操作,则隐藏时将重置自身(及其子代),并且必须使用作为 其构造函数参数传入的属性来 重新构造自身。如果您不希望 完全重置 ,则可以使用模型或控制器类或来保存用户的进度信息。
maintainState
falsePageRoute
State
initState
widget
PageStorage

这是一个演示这些概念的示例应用程序。

import 'package:flutter/material.dart';

void main() {
  runApp(new MaterialApp(
    onGenerateRoute: (RouteSettings settings) {
      if (settings.name == '/') {
        return new MaterialPageRoute<Null>(
          settings: settings,
          builder: (_) => new MyApp(),
          maintainState: false,
        );
      }
      return null;
    }
  ));
}

class MyApp extends StatefulWidget {
  MyAppState createState() => new MyAppState();
}

class MyAppState extends State<MyApp> with TickerProviderStateMixin {
  AnimationController _controller;

  @override
  void initState() {
    print("initState was called");
    _controller = new AnimationController(vsync: this)
      ..repeat(min: 0.0, max: 1.0, period: const Duration(seconds: 1))
      ..addListener(() {
        print('animation value ${_controller.value}');
      });
    super.initState();
  }

  @override
  void dispose() {
    print("dispose was called");
    _controller.dispose();
    super.dispose();
  }

  int _counter = 0;

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text('home screen')
      ),
      body: new Center(
        child: new RaisedButton(
          onPressed: () {
            setState(() {
              _counter++;
            });
          },
          child: new Text('Button pressed $_counter times'),
        ),
      ),
      floatingActionButton: new FloatingActionButton(
        child: new Icon(Icons.remove_red_eye),
        onPressed: () {
          Navigator.push(context, new MaterialPageRoute(
            builder: (BuildContext context) {
              return new MySecondPage(counter: _counter);
            },
          ));
        },
      ),
    );
  }
}

class MySecondPage extends StatelessWidget {
  MySecondPage({ this.counter });

  final int counter;

  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text('Certificate of achievement'),
      ),
      body: new Column(
        crossAxisAlignment: CrossAxisAlignment.stretch,
        mainAxisAlignment: MainAxisAlignment.spaceAround,
        children: [
          new Icon(Icons.developer_mode, size: 200.0),
          new Text(
            'Congrats, you clicked $counter times.',
            style: Theme.of(context).textTheme.title,
            textAlign: TextAlign.center,
          ),
          new Text(
            'All your progress has now been lost.',
            style: Theme.of(context).textTheme.subhead,
            textAlign: TextAlign.center,
          ),
        ],
      ),
    );
  }
}


 类似资料:
  • 在'body'中,两个'child'不能在?只允许一个?如果是的话,我如何添加像图片中那样的几个小部件呢?ex)ElevatedButton(),列(子项:?并且在“列(儿童:”下面有一个红色的下划线。有人能告诉我为什么会这样吗?

  • 问题内容: 在我的第一个Flutter应用上工作。应用程序主屏幕没有此问题,所有文本均应显示。 但是,在我正在开发的新屏幕中,所有文本小部件的下面都有一些奇怪的 黄线/双线。 有什么想法为什么会这样? 问题答案: 问题是没有。是应用程序(,之类的东西)的助手。但是您并没有被迫使用。 您缺少的是作为父级的实例。 为什么知道那么重要?因为当您开发模态(例如使用)时,您将面临相同的问题。但是Scaffo

  • 我正在尝试从Flutter中的父部件传递堆栈的高度,但我无法做到。请帮助我找到解决方案,我将把我的代码作为参考。 父小工具 子部件 如何将堆栈的高度传递给SVGPicture。

  • 我正在尝试创建一个非常简单的应用程序,当点击中心小部件时,列表中的元素会显示出来。 这是我的代码: 没有显示任何错误,但同时,我的目标没有达到,因为没有显示任何文本,即使我添加了这个代码打印(yourList[randomIndex]),也不会在终端中打印任何内容;。我如何显示文本,并使打印出现?

  • 有时当我启动应用程序时,我会得到这样的问题 谢谢。