我正在使用 Provider 来管理我的应用程序的状态。以下是我的实现方式。
催眠.dart
class _HypnoseAppState extends State<HypnoseApp> {
@override
Widget build(BuildContext context) {
UserService userService = UserService();
AudioUtilService audioUtilService = AudioUtilService();
return MultiProvider(
providers: [
ChangeNotifierProvider<UserService>.value(
value: userService,
),
ChangeNotifierProvider<AudioUtilService>.value(
value: audioUtilService,
)
],
child: MaterialApp(
debugShowCheckedModeBanner: false,
title: Globals.title,
theme: ThemeData(primarySwatch: Colors.cyan),
darkTheme: ThemeData.dark(),
initialRoute: '/',
routes: {
'/': (BuildContext context) => WelcomeScreen(userService),
'/home': (BuildContext context) => HomePageSwitcher(),
'/audiocreate': (BuildContext context) => AudioCreateScreen()
}),
);
}
}
home_switcher.dart
class HomePageSwitcher extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Consumer<UserService>(
builder: (BuildContext context, UserService userService, Widget child) {
return Scaffold(
appBar: AppBar(),
drawer: Drawer(
child: Column(
children: <Widget>[
UserAccountsDrawerHeader(
accountEmail: Text(userService.loggedInUser.email),
accountName: Text(userService.loggedInUser.name),
currentAccountPicture:
Image.network(userService.loggedInUser.avatar),
)
],
),
),
body: Center(
child: RaisedButton(
child: Text('Sign out'),
onPressed: () async {
await userService.signOut();
Navigator.pushNamed(context, '/');
},
),
));
},
);
}
}
user_service.dart
class UserService extends ChangeNotifier {
// Get auth instances
final GoogleSignIn _googleSignIn = GoogleSignIn();
final FirebaseAuth _auth = FirebaseAuth.instance;
// Store reference of user collection
final CollectionReference userDb = Firestore.instance.collection('user');
// Master instance of logged in user
User _loggedInUser;
// Getter to access loggedInUser
User get loggedInUser {
return _loggedInUser;
}
PublishSubject<AuthState> _authStateSubject = PublishSubject();
.... other code
现在这里的问题是,每次我热重载时,在主页上,我开始得到 NoSuchMethodError,因为它说电子邮件、名称等属性在 null 上被调用,我认为这意味着状态是丢失的。我怎样才能克服同样的问题?我做错了什么吗?
最佳答案
您不应使用 ChangeNotifierProvider.value
。而是使用默认构造函数:
ChangeNotifierProvider(
builder: (_) => UserService(),
)
否则,您的构建方法是不纯的,您将遇到 How to deal with unwanted widget build? 中描述的问题
关于 flutter :使用 Provider 时状态在热重载时丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56580988/