【问题标题】:Flutter stateless UI life cycleFlutter 无状态 UI 生命周期
【发布时间】:2019-11-01 03:25:11
【问题描述】:

我有一个基于 StatelessWidget 的 Flutter 应用程序。我看到exampleStatefulWidget 允许程序员在dispose() 方法中执行一些操作。我想看看StatelessWidget是否也提供这样的功能?

import 'package:flutter/material.dart';
import 'routes.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {

  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) { 
      return MaterialApp(
        title: 'My App',
        theme: ThemeData(
          primarySwatch: colorCustom,
          fontFamily: 'Roboto',
        ),
        initialRoute: '/',
        routes: routes,
      ); 
    }

}

更新

import 'package:flutter/material.dart';
import 'routes.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {

  Future<bool> _exitApp(BuildContext context) {
    return showDialog(
          context: context,
          child: new AlertDialog(
            title: new Text('Do you want to exit this application?'),
            content: new Text('We hate to see you leave...'),
            actions: <Widget>[
              new FlatButton(
                onPressed: () => Navigator.of(context).pop(false),
                child: new Text('No'),
              ),
              new FlatButton(
                onPressed: () => Navigator.of(context).pop(true),
                child: new Text('Yes'),
              ),
            ],
          ),
        ) ??
        false;
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'My App',
      home: WillPopScope(
          child: MaterialApp(
              theme: ThemeData(
                primarySwatch: colorCustom,
                fontFamily: 'Roboto',
              ),
              initialRoute: '/',
              routes: routes
          ),
          onWillPop: () => _exitApp(context)
      )
    );

}

嗯,更新代码后,AlertDialog 没有弹出?

【问题讨论】:

    标签: flutter


    【解决方案1】:

    简短的回答是否定的,StatelessWidget 中没有类似于dispose() 的方法,因为顾名思义,它不维护State

    长答案是dispose() mehtod -

    当这个State 对象永远不会再次构建时,框架会调用此方法。框架调用 dispose 后,State 对象被视为未挂载,mounted 属性为false。此时调用setState 是错误的。

    生命周期的这个阶段是终端:无法重新挂载已释放的State 对象。

    由于StatelessWidget 没有与之关联的State,因此没有dispose() 方法。

    StatelessWidgets 的类似解决方案 -

    那么如果我们只想在StatelessWidgets从导航堆栈中弹出或从StatelessWidget返回一些数据之后运行一些代码,我们应该怎么做?

    嗯,this Flutter 文档页面有一个解释这个例子的例子。希望这会有所帮助!

    【讨论】:

    • 如果我想在 Flutter 应用退出之前执行一些操作,我应该怎么做?
    • 您可以为此使用WillPopScope 小部件。它有一个回调onWillPop,当您按下设备上的返回按钮时会调用它。使用 WillPopScope 小部件将小部件包装在 build() 方法中,您可以在退出 onWillPop 回调之前提供要执行的操作。参考this问题的例子。
    • 嗯,我应该如何在 MaterialApp 小部件中添加 WillPopScope 小部件?
    • 您可以使用MaterialApp 将您当前拥有的小部件包装为homeWillPopScope
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多