再次调用时,颤振弹出的屏幕会保留值

时间:2020-01-10 05:32:22

标签: flutter

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

现在,如果我首先按下按钮2,即ScreenB(null),则快照在ScreenB中的确为空。但是,如果我按Button1,即ScreenB(快照),然后弹出ScreenB,然后按Button2,我希望快照在ScreenB中为空,但不是。

我在这里想念什么吗?欣赏一些启示。

根据要求添加了测试代码:

ScreenA:

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])));
                },
              ), ),
            ],
          ),
      ), );
  }
}

ScreenB:

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并点击按钮“转到带有空值的ScreenB”。屏幕B上的文本按预期显示“正在编辑中:否”。

  1. 在appBar上单击向后箭头以弹出ScreenB,然后点击“转到带有数据的ScreenB”。屏幕B上的文本按预期显示“正在编辑:是”。

  2. 重复1,现在ScreenB上的文本显示“ Is Editing:true”,这是不期望的。

2 个答案:

答案 0 :(得分:0)

是您在此处提到的类型为AsyncSnapshot的快照,如果是,则数据快照从不为空,快照的数据字段为空

# boardapp/__init__.py
from . import admin
from . import apps
from . import models
from . import tests
from . import urls
from . import views

让我知道这是否有帮助。

答案 1 :(得分:0)

最终做了:

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

屏幕B中的

。尽管变量为何即使在弹出屏幕后仍保留最后一个值,仍然感到困惑。