1

我想做一个登录应用程序。我有一个类用户,它有一个 id 和一个用户名,我想保留它以便稍后在应用程序中显示它,我有一个 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);
  }
}
4

0 回答 0