【问题标题】:ChangeNotifierProxyProvider flutter not getting update from ChangeNotifierProviderChangeNotifierProxyProvider 颤动未从 ChangeNotifierProvider 获取更新
【发布时间】:2021-03-18 09:04:24
【问题描述】:

我正在尝试从UserProvider 内部的ItemProvider 访问userModel.uid,以便它可以加载_savedItems

但是,当我调用loadUserSavedItems() 时,_userId 为空。

这是我的 main.dart

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'providers/user.dart';
import 'providers/item.dart';
import 'screens/home.dart';


void main() {
  Provider.debugCheckInvalidValueType = null;
  WidgetsFlutterBinding.ensureInitialized();

  runApp(
    MultiProvider(
      providers: [
        ChangeNotifierProvider<UserProvider>(
            create: (_) => UserProvider.initialize()),
        ChangeNotifierProxyProvider<UserProvider, ItemProvider>(
          create: (_) => ItemProvider(),
          update: (_, userProvider, itemProvider) => itemProvider,
        ),
      ],
      child: MaterialApp(
        debugShowCheckedModeBanner: false,
        theme: ThemeData(
          primaryColor: Colors.white,
          primaryTextTheme: TextTheme(
            headline6: TextStyle(color: Colors.black),
          ),
        ),
        home: Home(),
      ),
    ),
  );
}

UserProvider.dart


import 'models/user.dart';
import 'services/user.dart';

enum Status { Uninitialized, Authenticated, Authenticating, Unauthenticated }

class UserProvider extends ChangeNotifier {
  FirebaseAuth _auth;
  FirebaseUser _user;
  Status _status = Status.Uninitialized;
  Firestore _firestore = Firestore.instance;
  UserServices _userServicse = UserServices();
  UserModel _userModel;

//  getter
  UserModel get userModel => _userModel;
  Status get status => _status;
  FirebaseUser get user => _user;

  UserProvider.initialize() : _auth = FirebaseAuth.instance {
    _auth.onAuthStateChanged.listen(_onStateChanged);
    notifyListeners();
  }

  Future<void> _onStateChanged(FirebaseUser firebaseUser) async {
    if (firebaseUser == null) {
      _status = Status.Unauthenticated;
    } else {
      _user = firebaseUser;
      _status = Status.Authenticated;
      _userModel = await _userServicse.getUserById(user.uid);
    }
    notifyListeners();
  }

  Future<bool> signIn() async {
    bool retVal = false;
    try {
      _status = Status.Authenticating;
      notifyListeners();
      AuthResult _authResult = await _auth.signInWithEmailAndPassword(
          email: email.text.trim(), password: password.text.trim());
      if (_authResult.user != null) {
        retVal = true;
      }
    } catch (e) {
      _status = Status.Unauthenticated;
      notifyListeners();
      print(e.toString());
    }
    return retVal;
  }
}

ItemProvider.dart

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/foundation.dart';
import 'models/item.dart';
import 'providers/user.dart';
import 'services/item.dart';

class ItemProvider extends ChangeNotifier {
  ItemProvider({UserProvider userProvider}) : _userProvider = userProvider;

  UserProvider _userProvider;

  final databaseReference = Firestore.instance;
  ItemServices _itemServices = ItemServices();
  List<Item> _items = [];
  List<Item> _savedItems = [];
  String _userId;

  //  getter
  List<Item> get items => _items;
  List<Item> get savedItems => _savedItems;
  String get userId => _userId;
  UserProvider get userProvider => _userProvider;

  //get the items to load when the app is initiated
  ItemProvider.initialize() {
    loadAllActiveItems();
    if (_userProvider.status == Status.Authenticated) {
      loadUserSavedItems();
    }
  }

  //get active items from DB
  loadAllActiveItems() async {
    _items = await _itemServices.getBatchOfActiveItems();
    notifyListeners();
  }

  //get user saved items from DB
  loadUserSavedItems() async {
    _userId = userProvider.userModel.uid;
    _savedItems = await _itemServices.getUserSavedItems(userId);
    notifyListeners();
  }
}

有人可以帮助我吗,我不太确定我缺少什么,当实现为 ChangeNotifierProxyProvider 时,ItemProvider.dart 中的 userModel 对象/属性不能。

【问题讨论】:

    标签: flutter flutter-provider flutter-bloc flutter-state flutter-change-notifier


    【解决方案1】:

    我终于找到了一种解决方法,也许不是最好的,但它确实有效。

    ItemProvider 内部创建updates() 以接收来自的userId

      void updates(String userId, Status status) {
        this._userId = userId;
      }
    

    然后在main.dart 中进行更改以从ChangeNotifierProxyProvider 传递userId

    import 'package:flutter/material.dart';
    import 'package:provider/provider.dart';
    import 'providers/user.dart';
    import 'providers/item.dart';
    import 'screens/home.dart';
    
    
    void main() {
      Provider.debugCheckInvalidValueType = null;
      WidgetsFlutterBinding.ensureInitialized();
    
      runApp(
        MultiProvider(
          providers: [
            ChangeNotifierProvider<UserProvider>(
                create: (_) => UserProvider.initialize()),
            ChangeNotifierProxyProvider<UserProvider, ItemProvider>(
              create: (_) => ItemProvider(),
              update: (_, userProvider, itemProvider) => itemProvider
                ..updates(
                    userProvider.user != null ? userProvider.user.uid : ''),
            ),
          ],
          child: MaterialApp(
            debugShowCheckedModeBanner: false,
            theme: ThemeData(
              primaryColor: Colors.white,
              primaryTextTheme: TextTheme(
                headline6: TextStyle(color: Colors.black),
              ),
            ),
            home: Home(),
          ),
        ),
      );
    }
    
    
    

    很高兴听到其他人也做了什么。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-10
      • 2020-06-20
      • 2021-06-24
      • 1970-01-01
      • 1970-01-01
      • 2020-07-22
      • 2022-07-11
      • 2020-05-10
      相关资源
      最近更新 更多