Как использовать уведомление провайдера, когда мой пользователь входит в систему? - PullRequest
0 голосов
/ 31 марта 2020

Я новичок в трепетании и провайдере. Я хочу изменить вид входа в систему только после того, как пользователь войдет в систему. У меня есть виджет-оболочка, который прослушивает модель пользователя, если она была изменена, и автоматически отображает виджет аутентификации или домашний виджет. Приведенный ниже код не уведомляет оболочку о том, что пользователь не имеет значения null после того, как я вошел в систему. Я не знаю, это правильный способ его использования, но я надеюсь, что вы мне поможете.

//main.dart

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider<User>.value(
      value: User(),
      child: MaterialApp(),
        home: Wrapper(),
      ),
    );
  }
}

//wrapper.dart

class Wrapper extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final user = Provider.of<User>(context);
    //return either home or authenticate widget
    print(user);
    if (user == null) {
      return Authenticate();
    } else {
      return Home();
    }
  }
}

//authenticate.dart

class Authenticate extends StatefulWidget {
  @override
  _AuthenticateState createState() => _AuthenticateState();
}

class _AuthenticateState extends State<Authenticate> {
  @override
  Widget build(BuildContext context) {
    return Container(
      child: Signin(),
    );
  }
}

class Signin extends StatefulWidget {
  @override
  _SigninState createState() => _SigninState();
}

class _SigninState extends State<Signin> {
  final AuthService _auth = AuthService();
  @override
  Widget build(BuildContext context) {
    return Container(
      child: MaterialButton(
          onPressed: () async {
            if (_formKey.currentState.validate()) {
              dynamic result = await _auth.login(username, password);
            }
          },
      )
    )



//auth.dart

class AuthService {

  static const endpoint = 'http://192.168.254.100:8000';

  var client = new http.Client();

  Future login(String user, String password) async {
    try {
      var response = await client.get('$endpoint/rest_login/?username=test&password=test');

      return User.fromJson(json.decode(response.body));

    } catch (e) {
      return null;
    }
  }
}

//user.dart

class User with ChangeNotifier {
  int id;
  String name;
  String username;
  String email;
  String session;

  User({this.id, this.name, this.username, this.email, this.session});

  User.initial()
      : id = 0,
        name = '',
        username = '',
        email = '',
        session = '';

  User.fromJson(Map<String, dynamic> json) {
    id = json['id'];
    name = json['name'];
    username = json['username'];
    email = json['email'];
    session = json['session'];
    notifyListeners();
  }
}

Ответы [ 2 ]

0 голосов
/ 31 марта 2020

User.fromJson - конструктор. Не звоните туда notifyListeners().

Вы должны указать Consumer виджеты для модели, чтобы ее можно было перестроить, когда модель вызывает notifyListeners().

. Это может помочь

1010 *
0 голосов
/ 31 марта 2020

Способ использования ChangeNotifierProvider:

Widget create(BuildContext context) {
  return ChangeNotifierProvider<ModelClass>(
    builder: (context) => ModelClass(auth: auth),
    child: Consumer<ModelClass>(
      builder: (context, model, _) => View(model: model),
    ),
  );
}

Исходя из вышеуказанных логи c:

return ChangeNotifierProvider<User>(
      builder: (context) => User(auth: auth),
      child: Consumer<User>(
        builder: (context, user, _) =>
            YourView(user: user),
      ),
    )

Вам необходимо внести изменения в ваш виджет MyApp.

Пожалуйста, дайте мне знать, если это поможет. Спасибо.

...