Невозможно получить значения из класса провайдера - PullRequest
0 голосов
/ 18 января 2020

Извините, я новичок, и я застрял в этой проблеме. Я пытаюсь получить доступ к значению, используемому с changeNotifier, используя пакет провайдера, и просто распечатать его, но он всегда возвращает ноль.

Main.dart

    class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [
        ChangeNotifierProvider(
          create: (_) => LoginService(),
        )
      ],
      child: MaterialApp(
        title: 'Test',
        debugShowCheckedModeBanner: false,
        theme: ThemeData(
            primaryColor: Colors.deepOrange, accentColor: Colors.amber),
        home: HomePage(),
        routes: {ExpenseListPage.routeName: (ctx) => ExpenseListPage()},
      ),
    );
  }
}

LoginService.dart

class LoginService with ChangeNotifier {
  String backendUrl = 'http://10.0.2.2:3000/login';
  UserData _userData = UserData();

  // Login
  Future<bool> login({String email, String password}) async {
    var userData = {"email": email, "password": password};
    Response response = await post('$backendUrl/login', body: userData);
    String body = response.body;
    var userObject = jsonDecode(body);
    if (userObject['token'] != null) {
      setUserData(
        name: userObject['name'],
      );
      return Future.value(true);
    }
    return Future.value(false);
  }

  setUserData({String name}) {
    _userData.name = name;
    notifyListeners();
  }

  UserData getUserData() => _userData;
}

Новая страница, на которой я пытаюсь использовать ее после перехода со страницы входа в систему

class ExpenseListPage extends StatelessWidget {
  static const routeName = '/userExpenseList';

  @override
  Widget build(BuildContext context) {
    var exp = Provider.of<LoginService>(context).getUserData();
    print(exp.name); // I always get null printed here
    return Scaffold(
      appBar: AppBar(
        title: Text('Test'),
      ),
      body: Center(
        child: Text('Test'),
      ),
    );
  }
...