#flutter #dio
Вопрос:
я использую общие предпочтения для передачи данных с одного экрана на другой, несколько дней назад он отлично работал, но теперь он отправляет эту ошибку
Invalid argument(s) (value): Must not be null
я вызываю api входа в систему, он успешно работает, я получаю данные api о его ответе, но он переходит на часть после печати данных, он не переходит на другой экран, вот код функции входа
SharedPreferences myPrefs;
Future login() async {
Dio dio = new Dio();
try {
data = {
'username':"Munib khatri",
'password':"Munib123",
'date': formattedDate
};
await dio
.post(localhostUrlLogin, data: json.encode(data),)
.then((onResponse) async {
print(onResponse.data);
String name = (onResponse.data['User']['username']);
String email = (onResponse.data['User']['email']);
String designation = (onResponse.data['User']['Designation']);
String token = (onResponse.data['AccessToken']);
//here i am calling another api
data={
"token":token,
"username":name,
"leave":"Approved",
"type":"maternity"
};
dio
.post(localHostUrlleaveCount, data: json.encode(data))
.then((onResponse) async {
int sickCount=(onResponse.data['sick']);
int annualCount=(onResponse.data['annual']);
await myPrefs.setInt('sickCount', sickCount);
await myPrefs.setInt('annualCount', annualCount);
}).catchError((onerror){
});
await myPrefs.setString('name', name);
await myPrefs.setString('email', email);
await myPrefs.setString('designation', designation);
Navigator.push(
context, new MaterialPageRoute(builder: (context) => Navigation()));
});
} catch (e) {
print(e.toString());
}
}
Навигация:
class Navigation extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
debugShowCheckedModeBanner: false,
theme: new ThemeData(primaryColor: Colors.blue),
home: EmployeeNavigation(),
);
}
}
int _selectedTab = 0;
final _pageOptions = [Home(), location(), Profile()];
String getname = "";
String getemail = "";
String getdesignation = "";
String getaccesstoken = "";
// ignore: must_be_immutable
class EmployeeNavigation extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return EmployeeNavigationState();
}
}
class EmployeeNavigationState extends State<EmployeeNavigation> {
var email;
var designation;
var date;
bool valuefirst = false;
String backtext = "";
@override
Widget build(BuildContext context) {
return WillPopScope(
onWillPop: () async {
if (_selectedTab == 0) {
return true;
}
setState(() {
_selectedTab = 0;
});
return false;
},
child: Scaffold(
drawer: NavigationDrawerWidget(), //this is a drawer file
body: _pageOptions[_selectedTab],
bottomNavigationBar: BottomNavigationBar(
backgroundColor: Colors.blue[50],
type: BottomNavigationBarType.fixed,
currentIndex: _selectedTab,
onTap: (value) {
print(value);
setState(() {
_selectedTab = value;
});
},
items: [
BottomNavigationBarItem(icon: Icon(Icons.home), label: "Home"),
BottomNavigationBarItem(
icon: Icon(Icons.location_on), label: "Location"),
BottomNavigationBarItem(
icon: Icon(Icons.person),
label: "Profile",
),
],
)));
}
}
я получаю ответ от обоих api, но не могу перейти на другой экран.
Комментарии:
1. вы тоже можете опубликовать
Navigation()
код?2. хорошо ,позвольте мне отредактировать свой вопрос.
3. Где вы инициализируете
myPrefs
экземпляр?4. я редактирую свой пост, пожалуйста, проверьте
5. можете ли вы опубликовать два ответа?
Ответ №1:
myPrefs, похоже, не инициализирован !!!
Попробуй:
Future login() async {
Dio dio = new Dio();
var myPrefs = await SharedPreferences.getInstance();
...
}
Комментарии:
1. я описал это так
SharedPreferences myPrefs;
, не так ли это неправильно?2. Это не C …. В dart его переменная создана, а не инициализирована ! По умолчанию все переменные равны нулю.