我想在頁面瀏覽中將資料從一個頁面發送到另一個頁面而不轉到其他頁面我只想將其保存在某處并在其他頁面中使用它。
這是主螢屏代碼:
class home extends StatefulWidget {
home({Key? key}) : super(key: key);
@override
State<home> createState() => _homeState();
}
PageController controller = PageController();
int _index = 0;
class _homeState extends State<home> {
@override
Widget build(BuildContext context) {
return Scaffold(
// extendBody: true,
body: PageView(
controller: controller,
children: [
page(
controller: controller,
),
codechef(),
codeforce(sub: ""),
],
onPageChanged: (page) {
setState(() {
_index = page;
});
controller.jumpToPage(_index);
},
),
bottomNavigationBar: Container(
color: Color.fromARGB(255, 19, 63, 99),
child: Padding(
padding: const EdgeInsets.all(8),
child: GNav(
tabs: [
GButton(
icon: Icons.home,
text: "Home",
),
GButton(
icon: Cp.codechef_svgrepo_com,
text: "CodeChef",
),
GButton(
icon: Cp.codeforces_svgrepo_com,
text: "CodeForces",
)
],
onTabChange: (index) {
setState(() {
_index = index;
});
controller.jumpToPage(index);
},
color: Colors.green,
backgroundColor: Color.fromARGB(255, 22, 64, 98),
activeColor: Colors.white,
tabBackgroundColor: Color.fromARGB(255, 18, 44, 65),
gap: 20,
padding: EdgeInsets.all(20),
rippleColor: Color.fromARGB(255, 51, 23, 23),
selectedIndex: _index,
),
),
),
);
}
}
這是頁面()代碼:
import 'package:flutter/material.dart';
class page extends StatefulWidget {
PageController controller = PageController();
page({Key? key, required this.controller}) : super(key: key);
@override
State<page> createState() => _pageState();
}
class _pageState extends State<page> {
TextEditingController _textFieldController = TextEditingController();
late String codeDialog;
late String valueText;
bool en = false;
Future<void> _displayTextInputDialog(BuildContext context) {
return showDialog(
context: context,
builder: (context) {
return AlertDialog(
backgroundColor: Color.fromARGB(255, 55, 74, 90),
title: Text(
'UserName',
style: TextStyle(color: Colors.white),
),
content: TextFormField(
onChanged: (value) {
setState(() {
valueText = value;
});
},
controller: _textFieldController,
decoration: InputDecoration(
hintText: "Enter a valid user name",
hintStyle: TextStyle(color: Colors.white),
),
style: TextStyle(
color: Colors.white,
),
validator: (Value) {
if (Value!.isEmpty || Value == null) {
return "Enter User name";
}
},
),
actions: <Widget>[
ElevatedButton(
child: Text(
'CANCEL',
style: TextStyle(color: Colors.white),
),
onPressed: () {
setState(() {
Navigator.pop(context);
});
},
style: ElevatedButton.styleFrom(primary: Colors.red),
),
ElevatedButton(
child: Text(
'OK',
style: TextStyle(color: Colors.white),
),
onPressed: () {
setState(() {
en = true;
codeDialog = valueText;
MaterialPageRoute(
builder: (context) => codeforce(sub: codeDialog));
controller.jumpToPage(2);
Navigator.pop(context);
});
},
style: ElevatedButton.styleFrom(primary: Colors.green),
),
],
);
});
}
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.all(8.0),
child: Container(
child: Center(
child: GridView(
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2, crossAxisSpacing: 10),
children: [
Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10),
color: Color.fromARGB(255, 97, 78, 78)),
child: Column(
children: [
Icon(
Cp.codechef_svgrepo_com,
size: 100,
),
Text("CodeChef",
style: TextStyle(
fontSize: 20,
fontWeight: FontWeight.bold,
color: Color.fromARGB(255, 166, 201, 229),
))
],
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
crossAxisAlignment: CrossAxisAlignment.center,
),
),
InkWell(
onTap: () async {
await _displayTextInputDialog(context);
},
child: Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10),
color: Color.fromARGB(255, 40, 83, 118)),
child: Column(
children: [
Icon(
Cp.codeforces_svgrepo_com,
size: 100,
),
Text(
"CodeForces",
style: TextStyle(
fontSize: 20,
fontWeight: FontWeight.bold,
color: Color.fromARGB(255, 166, 201, 229)),
),
en ? Text(codeDialog) : Text("")
],
mainAxisAlignment: MainAxisAlignment.center,
),
),
)
],
shrinkWrap: true,
),
),
),
);
}
}
在這里,我想當有人輸入資料并單擊“確定”按鈕時,它應該轉到帶有字串的 codeforce 頁面。但是當我使用 Navigator.push() 時,它將替換我的螢屏,但我不想要。我希望它滑動到 codeforce 頁面并在其上寫入資料。
uj5u.com熱心網友回復:
使page
小部件采用回呼函式,例如onSave
:
final void Function(String data) onSave;
如果要保存的資料是String
. 否則使用其他型別。
然后在父小部件(home
我認為)中使用page
:
page(
onSave: (String data) {
// Do your magic here (probably set some state)
},
)
還可以像這樣從大寫字母中命名類:Page
. 這是非常重要的約定。
這是一個快速修復,但最后你想要一些狀態管理,比如BLoC
or GetX
。
uj5u.com熱心網友回復:
正如其他用戶已經說過的:
最好的解決方案是學習一個 StateManagement 工具。
我建議學習Provider,然后再學習RiverPod。因為這些解決方案不是 GetX,而是在 WidgetTree 的概念中并遵循單向資料流。
如果您打算使用企業級代碼,我建議您學習Bloc。
然后結合 2 RiverBloc
否則只需創建一個頂級字串變數并將其傳遞給建構式(這會很快變得混亂)。
uj5u.com熱心網友回復:
使用共享首選項插件要將資料保存在記憶體中的本地設備中,您可以在此處查看所有詳細資訊: 共享首選項
uj5u.com熱心網友回復:
在顫振中使用一些狀態管理,例如:GetX
...
uj5u.com熱心網友回復:
在此處使用 GetStorage 它非常易于使用:
寫入值:
box.write('quote', 'GetX is the best');
讀取值:
box.read('quote');
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/508342.html