Flutter provider state management, logout concept

前端 未结 2 1617
Happy的楠姐
Happy的楠姐 2020-12-19 11:29

I am trying to implement custom logout solution for my application, where no matter where user currently is, once the Logout button is clicked, app will navigat

2条回答
  •  旧巷少年郎
    2020-12-19 12:01

    I don't know why it wasn't working for you. Here is a complete example I built based on your description. It works!

    import 'package:flutter/material.dart';
    import 'package:provider/provider.dart';
    
    class Profile with ChangeNotifier {
      bool _isAuthentificated = false;
    
      bool get isAuthentificated {
        return this._isAuthentificated;
      }
    
      set isAuthentificated(bool newVal) {
        this._isAuthentificated = newVal;
        this.notifyListeners();
      }
    }
    
    void main() {
      return runApp(
        MultiProvider(
          providers: [
            ChangeNotifierProvider(
              create: (final BuildContext context) {
                return Profile();
              },
            )
          ],
          child: MyApp(),
        ),
      );
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(final BuildContext context) {
        return Consumer(
          builder: (final BuildContext context, final Profile profile, final Widget child) {
            return MaterialApp(
              title: 'Flutter Demo',
              theme: ThemeData(primarySwatch: Colors.blue),
              home: profile.isAuthentificated ? MyHomePage() : MyLoginPage(),
            );
          },
        );
      }
    }
    
    class MyHomePage extends StatelessWidget {
      @override
      Widget build(final BuildContext context) {
        return Scaffold(
          appBar: AppBar(title: const Text("Home [Auth Protected]")),
          body: Center(
            child: RaisedButton(
              child: const Text("Logout"),
              onPressed: () {
                final Profile profile = Provider.of(context, listen: false);
                profile.isAuthentificated = false;
              },
            ),
          ),
        );
      }
    }
    
    class MyLoginPage extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(title: const Text("Login")),
          body: Center(
            child: RaisedButton(
              child: const Text("Login"),
              onPressed: () {
                final Profile profile = Provider.of(context, listen: false);
                profile.isAuthentificated = true;
              },
            ),
          ),
        );
      }
    }
    

提交回复
热议问题