Flutter Navigator.pop 不会发回数据



这是我到目前为止的代码。我不知道出了什么问题,我也尝试了很多 youtube turolial 和其他东西,但它看起来流行不会返回正确的数据。我真的需要帮助,我已经花了 2 天了

void main() {
List<String> names = [];
List<String> mgs = [];
runApp(MaterialApp(
title: 'Returning Data',
home: HomeScreen(names, mgs),
));
}
class HomeScreen extends StatelessWidget {
List<String> names = [];
List<String> mgs = [];
HomeScreen(this.names, this.mgs);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: Colors.blue,
title: Text("Project_Drink"),
),
body: Container(
child: Column(
children: <Widget>[
new Expanded(
child:  ListView.builder
(
itemCount: mgs.length,
itemBuilder: (context, Index) {
return Text("Name: " + names[Index]
+" "+ "Mg: " + mgs[Index]);
}
)
)

],
),

),

bottomNavigationBar :BottomAppBar  (
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Row(
children: <Widget>[
const Expanded(child: Text("TOTAL : 200")),
FloatingActionButton(
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => AddProduct()),
);
},
child: Icon(Icons.add),
),

],
),
),
),
);
}
}

这是我希望它发回数据的AddProducts,然后我应该能够放入列表中。Lika a not pad


class AddProduct extends StatefulWidget {
@override
State createState() => new _AddProductState();
}

class _AddProductState extends State<AddProduct> {
List<String> names = [];
List<String> mgs = [];

//final TextEditingController eCtrl = new TextEditingController();
final nameController = TextEditingController();
final mgController = TextEditingController();

@override
Widget build (BuildContext ctxt) {
return new Scaffold(
appBar: AppBar(
backgroundColor: Colors.blue,
title: Text("New Drink"),
),
body: new Column(
children: <Widget>[
new TextField(
decoration: InputDecoration(
hintText: "Name",
),
controller: nameController,
),
new TextField(
decoration: InputDecoration(
hintText: "Mg",
suffixText: "Mg",
),
controller: mgController,
),
RaisedButton(
onPressed: (){
names.add(nameController.text);
mgs.add(mgController.text);
setState(() {});
nameController.clear();
mgController.clear();
Navigator.pop(context, names + mgs);
},
child: Text("ADD"),
),
],
)
);
}
}

我把你的列表移到了HomeScreen小部件而不是main函数上。您的主要功能应该只运行应用程序

void main() {
runApp(
MaterialApp(
title: 'Returning Data',
home: HomeScreen(),
),
);
}

我将你的HomeScreen小部件转换为StatefulWidget而不是StatelessWidget因为当您添加新项目并显示它屏幕时,您的状态会发生变化,而StatelessWidget无法做到这一点。会是这样的

Navigator.push返回一个未来值,所以如果你想声明一个变量,数据来自该值,你需要等待它。获取数据后,您可以将它们添加到列表中,但它需要在函数setState内部才能更新UI

class HomeScreen extends StatefulWidget {
@override
_HomeScreenState createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
List<String> names = [];
List<String> mgs = [];
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: Colors.blue,
title: Text("Project_Drink"),
),
body: Container(
child: Column(
children: <Widget>[
new Expanded(
child:  ListView.builder(
itemCount: mgs.length,
itemBuilder: (context, index) {
return Text("Name: " + names[index] + " " + "Mg: " + mgs[index]);
}
),
),
],
),
),
bottomNavigationBar: BottomAppBar(
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Row(
children: <Widget>[
Expanded(child: Text("TOTAL : 200")),
FloatingActionButton(
onPressed: () async {
// Navigator.push returns a future value so you need to await for it 
var data = await Navigator.push(
context,
MaterialPageRoute(builder: (context) => AddProduct()),
);
// After you get the data from the other page you need to add them into your lists inside setState function to update UI
setState(() {
names.add(data[0]);
mgs.add(data[1]);
});
},
child: Icon(Icons.add),
),
],
),
),
),
);
}
}

我没有在您的AddProduct小部件中更改任何内容。

class AddProduct extends StatefulWidget {
@override
State createState() => new _AddProductState();
}

class _AddProductState extends State<AddProduct> {
List<String> names = [];
List<String> mgs = [];
//final TextEditingController eCtrl = new TextEditingController();
final nameController = TextEditingController();
final mgController = TextEditingController();
@override
Widget build (BuildContext ctxt) {
return Scaffold(
appBar: AppBar(
backgroundColor: Colors.blue,
title: Text("New Drink"),
),
body: Column(
children: <Widget>[
TextField(
decoration: InputDecoration(
hintText: "Name",
),
controller: nameController,
),
TextField(
decoration: InputDecoration(
hintText: "Mg",
suffixText: "Mg",
),
controller: mgController,
),
RaisedButton(
onPressed: (){
names.add(nameController.text);
mgs.add(mgController.text);
setState(() {});
nameController.clear();
mgController.clear();
Navigator.pop(context, names + mgs);
},
child: Text("ADD"),
),
],
)
);
}
}

虽然这段代码应该可以按照你想要的方式工作,但我建议你看看一些状态管理方法,如提供程序、集团等。创建您想要做的事情会更有效。

用简单的方法尝试这个,当按下然后调用此方法时

goToView() async {
bool data=await   Navigator.push(context, new CupertinoPageRoute(builder:   (BuildContext context) {
return new CoolForgot();
}));
print(data);
}

我的下一个视图是忘记屏幕,所以我使用了CoolForgot((,您可以根据需要使用。

然后当在下一个视图中按后退按钮时(在我的例子中,CoolForgot(((调用了这个

Navigator.pop(context,true);

我有传递布尔值并获取布尔值,您可以传递任何类型的对象并从中获取。

最新更新