我在使用Flutter Provider时遇到问题…我的流程是这样的:将登录用户ID传递到新的小部件后->从那里将其预先保存到db,然后将其重定向到新的小部件(仪表板)。
这是登录后的小部件代码:
return MaterialApp( title: title, home: Scaffold( appBar: AppBar( title: Text(title), ), body: ListView( children: <Widget>[ Container( margin: EdgeInsets.all(8.0), child: Card( shape: RoundedRectangleBorder( borderRadius: BorderRadius.all(Radius.circular(8.0))), child: InkWell( onTap: () { var user = Provider.of<UserRepository>(context); user.savePreference(user.user.id, "Something"); user.navigateToNewPage(Dashboard(), context); print(user.user.id); },
这有效:
user.savePreference(user.user.id, "Something");
但这引起了一个问题:
user.navigateToNewPage(Dashboard(), context);
在仪表板小部件中,我正在创建以下代码:
Widget build(BuildContext context) { var user = Provider.of<UserRepository>(context);
在UserRepository中,我有这个:
class UserRepository with ChangeNotifier { User user; Status _status = Status.Uninitialized; Status get status => _status; User get getUser => user; UserRepository.instance(); Future<void> navigateToNewPage(Widget page, BuildContext context) { Navigator.push(context, MaterialPageRoute(builder: (context) => page)); }
我知道这个话题已经解决了问题,但是找不到适合我问题的东西。
尝试将脚手架下方的小部件树的一部分提取到单独的小部件中。您现在使用的上下文用于构建尚未导航的顶级窗口小部件。
产生的代码应如下所示:
return MaterialApp( title: title, home: Scaffold( appBar: AppBar( title: Text(title), ), body: LoginWidget() class LoginWidget extends StatelessWidget { @override Widget build(BuildContext context) { return ListView( children: <Widget>[ Container( margin: EdgeInsets.all(8.0), child: Card( shape: RoundedRectangleBorder( borderRadius: BorderRadius.all(Radius.circular(8.0))), child: InkWell( onTap: () { var user = Provider.of<UserRepository>(context); user.savePreference(user.user.id, "Something"); user.navigateToNewPage(Dashboard(), context); print(user.user.id); }, ... } }