我的Flutter应用程序中有2个屏幕:记录列表和用于创建和编辑记录的屏幕.
如果我将对象传递给第二个屏幕,这意味着我将编辑它,如果我传递null,则意味着我正在创建新项目.编辑屏幕是有状态的小部件,我不知道如何使用这种方法https://flutter.io/cookbook/navigation/passing-data/为我的情况.
class RecordPage extends StatefulWidget {
final Record recordObject;
RecordPage({Key key, @required this.recordObject}) : super(key: key);
@override
_RecordPageState createState() => new _RecordPageState();
}
class _RecordPageState extends State<RecordPage> {
@override
Widget build(BuildContext context) {
//.....
}
}
Run Code Online (Sandbox Code Playgroud)
如何访问recordObject里面_RecordPageState?
setState()方法应该被称为的内部initState()方法StatefullWidget吗?
我的理解是该initState()方法将自动应用状态。
下面的代码不起作用。post对象的值为空。
@override
void initState() {
ItemService.getItemById(widget.postId).then((DocumentSnapshot doc){
post = ItemService.getPostFromDocument(doc);
});
}
Run Code Online (Sandbox Code Playgroud)
但是下面的作品。
@override
void initState() {
ItemService.getItemById(widget.postId).then((DocumentSnapshot doc){
setState((){
post = ItemService.getPostFromDocument(doc);
});
});
}
Run Code Online (Sandbox Code Playgroud)
在其他一些情况下,即使不使用setState()同一类也可以正常工作。
因此,什么时候应该使用setState()内部initState()方法,什么时候不应该使用?
另一个相关问题:
super.initState()我initState()什么时候应该打电话给我?我不打扰没关系吗?
我设法通过如下构造函数将有状态类变量的值传递给State类:
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Demo',
home: MyHomePage('John', 'Morison'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage(this.fname, this.lname);
final String fname;
final String lname;
@override
_MyHomePageState createState() => _MyHomePageState(fname, lname);
}
class _MyHomePageState extends State<MyHomePage> {
_MyHomePageState(this.fname, this.lname);
final String fname;
final String lname;
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Text('Hello $fname $lname'),
)
);
}
}
Run Code Online (Sandbox Code Playgroud)
太奇怪了,因为有两个以上的变量,所以我不得不做很多工作。有没有更好的办法?
如果我删除或添加项目,我想更新我的ListView。现在,我只想删除项目,并立即看到项目的删除。
我的应用程序更复杂,因此我写了一个小示例项目来展示我的问题。
本TestItem类包含一些数据项:
class TestItem {
static int id = 1;
bool isFinished = false;
String text;
TestItem() {
text = "Item ${id++}";
}
}
Run Code Online (Sandbox Code Playgroud)
该ItemInfoViewWidget是对的UI表示TestItem,如果它完成(当该复选框被更改为true)中删除的项目。
class ItemInfoViewWidget extends StatefulWidget {
TestItem item;
List<TestItem> items;
ItemInfoViewWidget(this.items, this.item);
@override
_ItemInfoViewWidgetState createState() =>
_ItemInfoViewWidgetState(this.items, this.item);
}
class _ItemInfoViewWidgetState extends State<ItemInfoViewWidget> {
TestItem item;
List<TestItem> items;
_ItemInfoViewWidgetState(this.items, this.item);
@override
Widget build(BuildContext context) {
return new Card(
child: new Column(
children: <Widget>[
new Text(this.item.text),
new Checkbox(
value: this.item.isFinished, …Run Code Online (Sandbox Code Playgroud) 问题是我无法将我自己的类 ForceSelection 值从另一个屏幕传递到另一个屏幕的 StatefulWidget。它在 StatelessWidget 中运行良好。我试图从这个颤振教程中学习:https : //flutter.dev/docs/cookbook/navigation/passing-data#4-navigate-and-pass-data-to-the-detail-screen
我在 levelSelection.dart 中有这种类
class ForceSelection {
final String forceSelection;
final String langSelection;
ForceSelection(this.forceSelection, this.langSelection);
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试将值传递给下一个文件 PlayQuiz.dart
Game(forceSelection: ForceSelection('maa', 'fin'))
Run Code Online (Sandbox Code Playgroud)
game.dart 看起来像这样:
class Game extends StatelessWidget {
final ForceSelection forceSelection;
Game({Key key, @required this.forceSelection}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
title: forceSelection.langSelection, // TODO should work and change later
theme: new ThemeData(
primaryColor: Colors.white,
),
home: PlayQuiz(),
);
}
}
Run Code Online (Sandbox Code Playgroud)
我想将 ForceSelection 值传递给 PlayQuiz()
class PlayQuizState extends …Run Code Online (Sandbox Code Playgroud)