#api #flutter #flutter-layout
#API #flutter #flutter-макет
Вопрос:
Я запустил приложение flutter для изучения функций API, но у меня возникает проблема: когда я меняю страницу и возвращаюсь на предыдущую страницу, данные, которые я отображал, становятся нулевыми на всех страницах. и я не знаю причины этого.
ниже приведено изображение того, как это происходит -:
ниже приведен код, в котором я получаю данные с одной страницы на домашнюю страницу и показываю их. и он исчезает при изменении страницы -:
import 'package:education/LogIn_SignUp/Log_In.dart';
import 'package:education/Screens/Profile_Screen.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'About_Scree.dart';
import 'Change_Password.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';
import 'dart:async';
class homeView extends StatefulWidget{
var user_id;
var user_name;
var mobile_number;
var user_address;
var user_Email;
var coaching_id;
var coaching_name;
var coaching_address;
var primary_no;
var altnumber;
var coaching_email;
homeView({
this.user_id,this.user_name,this.mobile_number,this.user_address,this.coaching_id,this.coaching_name,
this.coaching_address,this.primary_no,this.altnumber,this.coaching_email,this.user_Email
});
@override
State<StatefulWidget> createState() => homeViewState();
}
class homeViewState extends State<homeView> {
TextEditingController editingController = TextEditingController();
var showItemList = List<String>();
int count = 10;
var userid, username, mobilenumber, useraddress, userEmail, coachingid, coachingname, coachingaddress;
var primaryno, alt_number, coachingemail;
void setdata(){
setState(() {
userid = widget.user_id;
username = widget.user_name;
mobilenumber = widget.mobile_number;
useraddress = widget.user_address;
userEmail = widget.user_Email;
coachingid = widget.coaching_id;
coachingname = widget.coaching_name;
coachingaddress = widget.coaching_address;
});
}
@override
void initState(){
// showItemList.addAll(initList);
// getData();
setdata();
super.initState();
}
@override
void dispose() {
editingController.dispose();
super.dispose();
}
/// -----------------------------------------------------------------------------------------------------------------------------
/// Main Build Function for the class.
/// -----------------------------------------------------------------------------------------------------------------------------
@override
Widget build(BuildContext context) {
return SafeArea(
child: Scaffold(
appBar: PreferredSize(
preferredSize: Size.fromHeight(90.0),
child: AppBar(
title: Padding(
padding: const EdgeInsets.only(top: 20),
child: Text(
'$coachingname',//'${widget.coaching_name}',
style: TextStyle(
fontSize: 25.0,
letterSpacing: 4.5,
fontFamily: 'Sarif',
fontWeight: FontWeight.w300,
color: Colors.white,
),
),
),
backgroundColor: Colors.deepPurpleAccent,
centerTitle: true,
actions: <Widget>[
Column(
children: [
InkWell(
child: new IconButton(
icon: Padding(
padding: const EdgeInsets.only(top: 20),
child: Icon(Icons.exit_to_app),
),
onPressed:(){
Navigator.pushReplacement(context, MaterialPageRoute(
builder: (context) => LoginPage(),
));
}
),
onTap: (){
Navigator.pushReplacement(context, MaterialPageRoute(
builder: (context) => LoginPage()
));
},
),
],
),
],
),
),
drawer: Drawer(
child: Container(
padding: EdgeInsets.all(10),
child: ListView(
children: <Widget>[
Container(
height: 180,
decoration: BoxDecoration(
gradient: LinearGradient(colors: [
Colors.purple.shade300,
Colors.deepPurpleAccent.shade200,
]),
),
child: Column(
children: [
Padding(
padding: const EdgeInsets.only(top: 45.0, bottom: 10),
child: Card(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(55),
),
color: Colors.blue,
child: Padding(
padding: const EdgeInsets.all(10.0),
child: Icon(Icons.perm_identity_outlined, color: Colors.white,size: 30),
)
),
),
Text(
'$username',//'${widget.user_name}',
style: TextStyle(
color: Colors.white,
fontSize: 24,
letterSpacing: 2.5,
),
),
],
),
),
ListTile(
title: Text('Profile',
style: TextStyle(
fontSize: 17,
fontWeight: FontWeight.w400,
letterSpacing: 1.5,
),
),
leading: Icon(Icons.person_pin, color: Colors.blue,),
selectedTileColor: Colors.blue,
onTap: (){
Navigator.pushReplacement(context, MaterialPageRoute(
builder: (context) => ProfilePage(
user_id: userid, user_name:username, mobile_number:mobilenumber, user_address:useraddress,
user_Email: userEmail,
)
));
},
),
ListTile(
title: Text('Change Password',
style: TextStyle(
fontSize: 17,
fontWeight: FontWeight.w400,
letterSpacing: 1.5,
),
),
leading: Icon(Icons.security, color: Colors.blue,),
selectedTileColor: Colors.blue,
onTap: (){
Navigator.pushReplacement(context, MaterialPageRoute(
builder: (context) => ChangePassword()
));
},
),
ListTile(
title: Text('About',
style: TextStyle(
fontSize: 17,
fontWeight: FontWeight.w400,
letterSpacing: 1.5,
),
),
leading: Icon(Icons.info_outline, color: Colors.blue,),
selectedTileColor: Colors.blue,
onTap: (){
Navigator.pushReplacement(context, MaterialPageRoute(
builder: (context) => AboutScreen(
coaching_id:coachingid, coaching_name:coachingname, coaching_address:coachingaddress,
primary_no:primaryno, altnumber:alt_number, coaching_email:coachingemail
)//coaching details
));
},
),
ListTile(
title: Text(
'Rate',
style: TextStyle(
fontSize: 17,
fontWeight: FontWeight.w400,
letterSpacing: 1.5,
),
),
leading: Icon(Icons.star_border_outlined, color: Colors.blue,),
selectedTileColor: Colors.blue,
onTap: (){
},
),
Divider(
color: Colors.red,
thickness: 1,
),
SizedBox(height: 10,),
Text(
'Contact Us',
style: TextStyle(
fontSize: 20,
color: Colors.grey[800],
letterSpacing: 1.5,
fontWeight: FontWeight.w500,
),
),
SizedBox(height: 10,),
ListTile(
title: Text('Share',
style: TextStyle(
fontSize: 17,
fontWeight: FontWeight.w400,
letterSpacing: 1.5,
),
),
leading: Icon(Icons.share, color: Colors.blue,),
selectedTileColor: Colors.blue,
onTap: (){
},
),
ListTile(
title: Text('Privacy Policy',
style: TextStyle(
fontSize: 17,
fontWeight: FontWeight.w400,
letterSpacing: 1.5,
),
),
leading: Icon(Icons.privacy_tip, color: Colors.blue,),
selectedTileColor: Colors.blue,
onTap: (){
},
),
ListTile(
title: Text(
'LogOut',
style: TextStyle(
fontSize: 17,
fontWeight: FontWeight.w400,
letterSpacing: 1.5,
),
),
leading: Icon(Icons.logout, color: Colors.blue,),
selectedTileColor: Colors.blue,
onTap: (){
Navigator.pushReplacement(context, MaterialPageRoute(
builder: (context) => LoginPage()
));
},
),
],
),
),
),
body: Container(),
),
);
}
}
данные, которые я передаю на эту страницу, как показано ниже -:
I/flutter ( 4512): {address: jaipur, jaipur, alt_number: 9865358577, coach_address: Gautam Budha nagar, noida, coach_id: 2, coach_name: SSG Coaching, coaching_email: SSG@gmail.com, mobile_number: 9999999999, primary_no: 9898557898, res: success, user_id: 3, user_mail: s@gmail.com, user_name: sagar, user_pass: sagar123}
пожалуйста, помогите, поскольку я не могу отследить ошибку или найти какое-либо решение.
Комментарии:
1. означает, что вы хотите предположить, что вы переходите с главной страницы на домашнюю страницу, тогда отображаются данные, но когда вы переходите с домашней страницы на другую страницу и возвращаетесь на другую страницу, тогда данные отображаются неправильно?
2. да, всякий раз, когда я меняю страницу, данные исчезают
3. Да, потому что вы отправляете данные только с одной страницы через конструктор. Итак, этот разделитель данных
Ответ №1:
это действительно нормально, потому что ваши данные не хранятся в постоянном хранилище, таком как SQL lite, общие настройки и т. Д. И вы не должны сохранять ничего, что не имеет значения, в постоянное локальное хранилище, потому что это слишком дорого для размера вашего приложения. Существует нечто большее, чем управление состоянием, с помощью управления состоянием вам не потребуется хранить ваши данные в постоянном хранилище, вместо того, чтобы хранить ваши данные во временном, так называемом, «полупостоянном» состоянии. если вы хотите узнать больше об управлении своими данными, не выполняя асинхронные действия, как сумасшедшие, вы можете выполнить следующие шаги.
сначала нужно передать данные с помощью ванильного навигатора и конструктора класса (зависит от вашего типа маршрутов «именованный или не именованный классом тип маршрутов»), как тот, о котором упоминал @dshukertjr
Navigator.push(context, MaterialPageRoute(
builder: (context) => ProfilePage(user_id: userid, user_name:username, mobile_number:mobilenumber, user_address:useraddress,user_Email: userEmail,)
));
или использование именованного маршрута вместо
Navigator.pushNamed(context, PackageWeight.routeName, arguments: Your data here);
узнайте здесь об именованных маршрутах :
https://flutter.dev/docs/cookbook/navigation/named-routes
- Плюсы: это просто af,
- минусы: вы не можете передавать свои данные во все приложения только с помощью этого, потому что этого недостаточно для управления состоянием для большого количества виджетов.
второе — сохранить текущие данные локально с помощью управления провайдером / состоянием узнайте здесь об управлении состоянием. подсказка: вы можете использовать пакет provider, это действительно просто, просто добавьте некоторый класс map для анализа данных https://flutter.dev/docs/development/data-and-backend/state-mgmt/simple
- Плюсы: это действительно удобно для управления состоянием для множества виджетов.
- Минусы: иногда излишне использовать поставщика и потребителя для выполнения простой задачи, такой как сохранение кнопки сохранения и т. Д
- Личный совет: изучите это, вы не пожалеете об этом, потому что вы можете использовать это практически везде и в любой ситуации в flutter для управления состоянием и данными (полупостоянно).
Комментарии:
1. большое вам спасибо за эту информацию, я ее прочитаю
Ответ №2:
Это потому, что вы используете Navigator.pushReplacement вместо Navigator.push. При использовании pushReplacement текущий маршрут переопределяется новым маршрутом.
Так что используйте это:
Navigator.push(context, MaterialPageRoute(
builder: (context) => ProfilePage(
user_id: userid, user_name:username, mobile_number:mobilenumber, user_address:useraddress,
user_Email: userEmail,
)
));
И внутри страницы профиля используйте
Navigator.pop(context);
Чтобы вернуться к домашнему просмотру