Как получить доступ к данным через Provider.of

#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]));
  

Теперь все работает нормально