扑:如何从数据库获取数据并在整个应用程序中使用它

时间:2020-07-14 09:25:07

标签: flutter state-management

我对状态管理感到很困惑。

下面是我通过小部件传递数据。

List<AppUser> userList = List<AppUser>();
List<List<MessageType>> messageLists = new List<List<MessageType>>();

@override
  void initState() {
    super.initState();

    loadUsers();
  }

Future<void> loadUsers() async {
    userList.clear();
    userList.addAll(await AppUser.getRelatedUsers(customer.customerID));

    defaultUser = await AppUser.getDefaultUser(customer.customerID);

    if (defaultUser != null && !await defaultUser.hideUserTab()) {
      userList.add(defaultUser);
    }

  await loadMessageList();
  }

然后,我将userList和messageList传递给另一个有状态的小部件。但是,如果我想使用继承的小部件或提供程序或块在整个应用程序中拥有这些数据,该怎么办?

 MessageTypePage(
      messageTypeList: messageLists[tabIndex],
      currentUser: userList[tabIndex],
    );

如何从db获取数据并将其存储在继承的小部件中,然后使用这些数据?我很困惑。

class StateContainer extends StatefulWidget {
  final Widget child;
  final List<AppUser> userList;
  final List<Message> messageList;

  StateContainer({@required this.child, this.userList, this.messageList});

  static StateContainerState of(BuildContext context) {
    return context.dependOnInheritedWidgetOfExactType<_InheritedStateContainer>().data;
   
  }

  @override
  StateContainerState createState() => new StateContainerState();
}

class StateContainerState extends State<StateContainer> {
  List<AppUser> userList = List<AppUser>();
  List<List<MessageType>> messageLists = new List<List<MessageType>>();
  
  @override
  Widget build(BuildContext context) {
    return _InheritedStateContainer(
      data: this,
      child: widget.child,
    );
  }
}

class _InheritedStateContainer extends InheritedWidget {

  final StateContainerState data;

  _InheritedStateContainer({Key key, @required this.data, @required Widget child}) : super(key: key, child: child);

  @override
  bool updateShouldNotify(_InheritedStateContainer oldWidget) {
    return true;
  }
}

1 个答案:

答案 0 :(得分:0)

我认为,最好的方法是使用Provider或Bloc。有一个不稳定的代码实验室,它使用Provider来完成与您正在执行的操作非常相似的操作。它存储可在整个应用程序中使用的项目列表(在您的情况下为用户)。它还向您展示了如何以各种方式操作列表。

The codelab is here。我认为这会帮助您。