【发布时间】: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”。
点击 appBar 上的后退箭头以弹出 ScreenB,然后点击“Goto ScreenB with data”。 ScreenB 上的文本按预期显示“Is Editing: true”。
重复 1,现在 ScreenB 上的文本按预期显示“正在编辑:真”。
【问题讨论】:
标签: flutter