flutter :使用 Provider 时状态在热重载时丢失

标签 flutter dart flutter-dependencies

我正在使用 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/

相关文章:

dart - 初始化程序中只有静态成员

flutter - flutter update gradle 错误后 Hive 导入和 pub get

ios - 如何在 Flutter 应用程序中显示原生 iOS View ?

flutter - 如何在没有错误的情况下将Future <void> main转换为dart flutter 中的Future <List>

firebase - 配置默认 Firebase 应用 __FIRAPP_DEFAULT

flutter - 如何为Flutter Web添加Firebase预制的Auth UI?

firebase - 无法通过点击通知导航到特定页面。 Flutter 深度链接问题

Flutter 排序数据 Firestore 与 Streambuilder

firebase - flutter/FirebaseAuth : How can I autologin a user at app launch?

json - Flutter-在空调用方法 '[]'