#flutter #dart
#flutter #dart
Вопрос:
Я пытаюсь выяснить, как получить данные через провайдера, но я застрял.
мой main.dart
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MultiProvider(
providers: [
ChangeNotifierProvider<UserBocorp>(
create: (context) => UserBocorp(),
)
],
child: MaterialApp(
debugShowCheckedModeBanner: false,
home: IsLogin(),
routes: {
LoginPage.routeName: (ctx) => LoginPage(),
HomePage.routeName: (ctx) => HomePage(),
Article.routeName: (ctx) => Article(),
Staffs.routeName: (ctx) => Staffs(),
},
),
);
}
}
Но как только я хочу получить данные в другом виджете, я получаю null
мой класс userBocorp:
class UserBocorp extends ChangeNotifier {
final int id;
final String name;
final String lastname;
final String photo;
final int typeUser;
UserBocorp({this.id, this.name, this.lastname, this.photo, this.typeUser});
factory UserBocorp.fromJson(Map<String, dynamic> json) {
return UserBocorp(
id: json['id'],
name: json['name'],
lastname: json['lastname'],
photo: json['avatar'],
typeUser: json['type'],
);
}
UserBocorp jsonresponse;
Future<UserBocorp> createAlbum() async {
final http.Response response = await http.post(
'https://test.com/api/getUserName',
headers: <String, String>{
'Content-Type': 'application/json; charset=UTF-8',
},
body: jsonEncode(<String, String>{
'title': 'test@test.com',
}),
);
final jsonresponse = json.decode(response.body);
notifyListeners();
return UserBocorp.fromJson(jsonresponse[0]);
}
}
Как я могу получить пользовательские данные в любых других виджетах? Я был бы благодарен за любую помощь
Я впервые получаю данные при возврате виджета главной страницы
FutureBuilder <UserBocorp> (
future: Provider.of <UserBocorp> (context, listen: false) .createAlbum (),
Данные отображаются нормально, но как только я захочу получить доступ к тем же данным в другом виджете через:
Widget build(BuildContext context) {
var user = Provider.of<UserBocorp>(context);
return Drawer(
Я просто получаю null в своих данных без каких-либо ошибок
Ответ №1:
То, что вы ищете, — это «Потребитель», который использует эти данные.
Взгляните на: https://flutter.dev/docs/development/data-and-backend/state-mgmt/simple .
В нескольких словах, что-то вроде этого:
return Consumer<UserBocorp>(
builder: (context, user, child) {
return Text("Name: ${user.name}");
},
);
Комментарии:
1. Спасибо за ответ, но я все равно получаю null
2. Если вы получаете значение null без ошибок, вероятно, ваши данные равны нулю, и вы их не заполняете. На самом деле, у вас просто есть что-то вроде
String name;
, но что, если вы неправильно инициализируете его? Если будет равно нулю.3. Он упомянул, что данные поступают в основной виджет
4. Это может зависеть от контекста, который он использует для его получения.
Ответ №2:
Попробуйте использовать ChangeNotifierProvider.value
вместо ChangeNotifierProvider
ChangeNotifierProvider.value(value: UserBocorp()),
Ответ №3:
Я исправил проблему, добавив get в свой класс
var _userInfo;
get userInfo => _userInfo;
void setUserInfo(info) {
_userInfo = info;
}
и после получения ответа:
setUserInfo(UserBocorp.fromJson(jsonresponse[0]));
Теперь все работает нормально