【问题标题】:Flutter popped screen retains values when called again再次调用时颤振弹出屏幕保留值
【发布时间】:2020-01-12 11:14:31
【问题描述】:

我有一个带有 2 个按钮的 ScreenA。按钮 1 按下 ScreenB(snapshot) 并作为 ScreenB(this.snapshot) 接收。按钮 2 按下 ScreenB(null)。根据 ScreenB 中快照是否为空,在 ScreenB 的 initState 中触发不同的方法。

现在,如果我第一次按下按钮 2,即 ScreenB(null),ScreenB 中的快照确实为 null。但是如果我按下 Button1,即 ScreenB(snapshot),然后弹出 ScreenB,然后按下 Button2,我希望 ScreenB 中的快照为空,但事实并非如此。

我在这里遗漏了什么吗?欣赏一些启示。

按要求添加测试代码:

屏幕A:

import 'screen_b.dart';
import "package:flutter/material.dart";
import 'mock_data.dart';
List < MockData > snapshot = List < MockData > ();

class ScreenA extends StatelessWidget {
   
  @override
  Widget build(BuildContext context) {
    snapshot.add(MockData("1", "title", "description"));
    return Scaffold(
      appBar: AppBar(
        title: Text("ScreenA"),
        centerTitle: true,
      ),
      body: Padding(
        padding: const EdgeInsets.all(12.0),
          child: ListView(
            children: < Widget > [

              Center(child: FlatButton(
                child: Text("Goto ScreenB with null", style: TextStyle(fontSize: 20.0, color: Colors.blue)),
                onPressed: () {
                  Navigator.of(context).push(
                    MaterialPageRoute(builder: (context) => ScreenB(null)));
                },
              ), ),
              SizedBox(height: 20.0), Center(child: FlatButton(
                child: Text("Goto ScreenB with data", style: TextStyle(fontSize: 20.0, color: Colors.blue)),
                onPressed: () {
                  Navigator.of(context).push(
                    MaterialPageRoute(builder: (context) => ScreenB(snapshot[0])));
                },
              ), ),
            ],
          ),
      ), );
  }
}

屏幕B:

import "package:flutter/material.dart";
import 'mock_data.dart';

bool editing = false;
class ScreenB extends StatefulWidget {
  ScreenB(this._snapshot);
  final MockData _snapshot;

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

class _ScreenBState extends State < ScreenB > {
  @override
  void initState() {
    super.initState();
    if (widget._snapshot != null) {
      editing = true;
    }

  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("ScreenB"),
        centerTitle: true,
      ),
      body: Padding(
        padding: const EdgeInsets.all(30.0),
          child: Center(child: Text("Is Editing: $editing ",
              style: TextStyle(fontSize: 20.0, color: Colors.red)),

          ),
      ), );
  }
}

MockData 类:

class MockData {
  String id;
  String title;
  String description;
  MockData(this.id, this.title, this.description);
}

测试: 1. 运行 ScreenA 并点击“Goto ScreenB with null”按钮。 ScreenB 上的文本按预期显示“Is Editing: false”。

  1. 点击 appBar 上的后退箭头以弹出 ScreenB,然后点击“Goto ScreenB with data”。 ScreenB 上的文本按预期显示“Is Editing: true”。

  2. 重复 1,现在 ScreenB 上的文本按预期显示“正在编辑:真”。

【问题讨论】:

    标签: flutter


    【解决方案1】:

    你这里提到的快照是 AsyncSnapshot 类型的快照,如果是则数据快照永远不会为空,快照的数据字段为空

    snapshot.data == null
    

    如果这有帮助,请告诉我。

    【讨论】:

    • 不,不是 AsyncSnapshot。来自列表对象的快照。
    • 您能分享一下您正在使用的代码的要点吗?
    【解决方案2】:

    最后做了:

    @override
    void dispose() {
      editing = false;
      super.dispose();
    }

    在屏幕 B 中。即使在屏幕弹出之后,为什么变量仍然保留最后一个值仍然令人困惑。

    【讨论】:

      猜你喜欢
      • 2023-01-11
      • 2021-10-25
      • 2021-02-15
      • 2020-10-10
      • 2021-07-12
      • 2021-12-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多