Флаттер: унаследованный виджет - PullRequest
0 голосов
/ 14 сентября 2018

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

void main() {
  runApp(MyApp());

 class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Model(
      user: User(),
      child: MaterialApp(
        routes: {
          '/login': (context) => new LoginView(),
          '/homepage_view': (context) => new HomepageView(),
        },
        title: 'Flutter login demo',
        home: RootPage(),
      ),
    );
  }
}

В корневой странице:

enum UserStatus {
  notDetermined,
  notSignedIn,
  signedIn,
}

class RootPage extends StatefulWidget {
  @override
  _RootPageState createState() => _RootPageState();
}

class _RootPageState extends State<RootPage> {

  UserStatus userStatus = UserStatus.notDetermined;

  @override
  void didChangeDependencies() {
    // TODO: implement didChangeDependencies
    super.didChangeDependencies();
    var user = Model.of(context).user;
    setState(() {
      userStatus = user.id == null? UserStatus.notSignedIn : UserStatus.signedIn;
      print((userStatus));
    });
  }

  void _signedIn() {
    setState(() {
      userStatus = UserStatus.signedIn;
    });
  }

  void _signedOut() {
    setState(() {
      userStatus = UserStatus.notSignedIn;
    });
  }

  @override
  Widget build(BuildContext context) {

    switch (userStatus) {
      case UserStatus.notDetermined:
        return _buildWaitingScreen();
      case UserStatus.notSignedIn:
        return LoginView(
          onSignedIn: _signedIn,
        );
      case UserStatus.signedIn:
        return HomepageView(
          onSignedOut: _signedOut,
        );
    }
    return Container(
      child: Text(("CHILD")),
    );
  }
}


Widget _buildWaitingScreen() {
  return Scaffold(
    body: Container(
      alignment: Alignment.center,
      child: CircularProgressIndicator(),
    ),
  );
}

самый важный материал на странице входа в систему ::

var user = Model.of(context).user;
 user = await getUserByIdClient()
if (user.loginError == false){
        print (user);
        widget.onSignedIn();
}

Вот мой унаследованный виджет:

class Model extends InheritedWidget {
  Model({Key key, Widget child, this.user}) : super(key: key, child: child);
  final User user;

  @override
  bool updateShouldNotify(InheritedWidget oldWidget) => true;

  static Model of(BuildContext context) {
    return (context.inheritFromWidgetOfExactType(Model) as Model);
  }
}
...