[英]Flutter. Get data from Navigator.of(context)
我是 flutter 的初學者,現在正在嘗試制作應用程序。
我有 3 頁。
第一頁有一個帶 Navigator.of(context).pushnamed('/second') 的 ElevatedButton 第二頁有一個 textEditingController,textEditingController 的值為 [int] Evalue。 我通過 Navigator.of(context).pushReplacementNamed('/third, arguments: Evalue) 更改屏幕 最后一頁有一個 ElevatedButton 來顯示 Evalue,並通過 Navigator.of(context).pop(Evalue) 更改屏幕(我也通過 ModalRoute.of(context)..setting.arguments 從 Secondpage 獲得 Evalue
但是當我來到第一頁時,我沒有從 Lastpage 獲得 Evalue。 我得到了 Null 的價值。
這是我在第一頁的代碼。 onPressed: () 異步 {
最終值 = await Navigator.of(context).pushNamed('/second');
每次我得到 null...
什么是問題家伙? 無論如何從第三頁到第一頁獲取數據?
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:path/path.dart';
import 'package:sqflite/sqflite.dart';
import 'database.dart';
import 'alphabeta.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
Future<Database> database = initDatabase();
return MaterialApp(
title: 'NoiceAnalytics',
theme: ThemeData(
primarySwatch: Colors.blue,
),
initialRoute: '/',
routes: {'/': (context) => WidgetApp(database),
'/first': (context) => first(database),
'/second': (context) => second(database),
'/third': (context) => third(database),
'
}
);
}
class WidgetApp extends StatefulWidget {
final Future<Database> db;
WidgetApp(this.db);
@override
_WidgetApp createState() => _WidgetApp();
}
class _WidgetApp extends State<WidgetApp> {
@override
Widget build(BuildContext context) {
database? db4;
return Scaffold(
body: Container(
child: Center(
child: Column(
children: <Widget>[
Padding(
padding: EdgeInsets.all(15),
child: SizedBox(width: 250, height: 80,
child: ElevatedButton(
child: Text(
'Noise', style: TextStyle(fontSize: 20),),
onPressed: () async {
final db3 = await Navigator.of(context).pushNamed('/second');
},
style: ElevatedButton.styleFrom(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(20))),
)
)
),
}
class second extends StatefulWidget {
final Future<Database> db;
second(this.db);
@override
State<StatefulWidget> createState() => _second();
}
class _second extends State<Backgroundnoise>{
TextEditingController? bgnController;
TextEditingController? measuretimeController;
@override
void initState(){
super.initState();
bgnController = new TextEditingController();
measuretimeController = new TextEditingController();
}
@override
Widget build(BuildContext context){
return Scaffold(
body: Container(
child: Center(
child: SingleChildScrollView(scrollDirection: Axis.vertical,
child: Column(
children: <Widget>[
Padding(
padding: EdgeInsets.only(top: 100 ,bottom: 15),
child: Text('Background', style: TextStyle(fontSize: 20)),
),
Padding(
padding: EdgeInsets.all(15),
child: SizedBox(width: 250, height: 80,
child: TextField(
controller: bgnController,
decoration: InputDecoration(labelText: 'enter the value', hintText: 'Ex)80.5'),
keyboardType: TextInputType.number,
)
)
),
Padding(
padding: EdgeInsets.all(15),
child: Text('Time', style: TextStyle(fontSize: 20)),
),
padding: EdgeInsets.all(15),
child: SizedBox(width: 250, height: 80,
child: TextField(
controller: measuretimeController,
decoration: InputDecoration(labelText: 'enter the value', hintText: 'Ex)80.5'),
keyboardType: TextInputType.number,
)
)
),
Padding(
padding: EdgeInsets.all(15),
child: SizedBox(width: 250, height: 80,
child: ElevatedButton(
child: Text('result', style: TextStyle(fontSize: 20),), onPressed: (){
database db1 = database(
bgn: bgnController!.value.text,
measuretime: measuretimeController!.value.text,
Navigator.of(context).pushReplacementNamed('/third', arguments: db1);
},
style: ElevatedButton.styleFrom(shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(50))),
),
),
)
],
mainAxisAlignment: MainAxisAlignment.center,
),
),
),
),
);
}
}
class third extends StatefulWidget {
final Future<Database> db;
third(this.db);
@override
State<StatefulWidget> createState() => _third();
}
class _third extends State<Calculation> {
@override
Widget build(BuildContext context) {
final database db2 = ModalRoute.of(context)!.settings.arguments as database;
return Scaffold(
body: Container(
child: Center(
child: Column(children: <Widget>[
Padding(
padding: EdgeInsets.only(top: 15 ,bottom: 15),
child: Text('S.sound', style: TextStyle(fontSize: 20)),
),
Padding(
padding: EdgeInsets.all(15),
child: SizedBox(width: 250, height: 80,
child: ElevatedButton(
child: Text(db2.bgn.toString(), style: TextStyle(fontSize: 20),),
onPressed: () {},
style: ElevatedButton.styleFrom(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(50))),
),
),
),
Padding(
padding: EdgeInsets.all(15),
child: Text('Level', style: TextStyle(fontSize: 20)),
),
Padding(
padding: EdgeInsets.all(15),
child: SizedBox(width: 250, height: 80,
child: ElevatedButton(
child: Text(db2.measuretime.toString(), style: TextStyle(fontSize: 20),),
onPressed: () {},
style: ElevatedButton.styleFrom(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(50))),
),
),
),
Padding(
padding: EdgeInsets.only(top: 30),
child:
Row(children: <Widget>[
Padding(
padding: EdgeInsets.all(5),
child:
SizedBox(width: 200, height: 80,
child: ElevatedButton(
child: Text('Save and Quit', style: TextStyle(fontSize: 20),),
onPressed: (){
Navigator.of(context).pop(db2);
},
style: ElevatedButton.styleFrom(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(50)))
)
)
),
],mainAxisAlignment: MainAxisAlignment.center
)
)
],
mainAxisAlignment: MainAxisAlignment.center,
),
)
)
);
}
}
database.dart 在哪里
class database{
int? id;
String? bgn;
String? measuretime;
database({this.id, this.bgn ,this.measuretime});
Map<String, dynamic> toMap(){
return{
'id': id, 'bgn': bgn, 'measuretime': measuretime
};
}
}
我認為你的錯誤在於你如何從你推送的新屏幕中檢索你的價值。
目前,據我了解,您正在使用:
final value = await Navigator.of(context).pushNamed('/second');
這確實會給你一個null
值。
您需要在新屏幕中使用settings.argument
。 ModalRoute.of(context)..settings.arguments
你可以在這里找到更多相關信息:
https://docs.flutter.dev/cookbook/navigation/passing-data https://docs.flutter.dev/cookbook/navigation/navigate-with-arguments
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.