flutter: как получить данные из базы данных и использовать их во всем приложении - PullRequest
0 голосов
/ 14 июля 2020

Я так запутался в управлении состоянием.

Ниже я передаю данные через виджеты.

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 другому виджету с отслеживанием состояния. Но что, если я хочу иметь эти данные во всем приложении с использованием унаследованного виджета или поставщика или blo c.

 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 голосов
/ 14 июля 2020

На мой взгляд, лучше всего использовать Provider или Blo c. Существует кодовая лаборатория флаттера, которая использует Provider для выполнения чего-то очень похожего на то, что делаете вы. Он хранит список элементов (в вашем случае это будут пользователи), которые можно использовать во всем приложении. Он также показывает вам, как управлять списком различными способами.

Кодовая таблица находится здесь . Думаю, это вам поможет.

...