Дарт сделать синглетон без использования асинхронных и ждать снаружи - PullRequest
0 голосов
/ 09 июня 2019

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

  1. iЯ должен использовать async и await вне класса
  2. Я должен использовать это только для функции main, потому что основной метод должен быть асинхронным

, например:

мой синглтон-класс:

class MydbModel {
  UserDao _userDao;

  MydbModel._(this._userDao);
  static Future<MydbModel> create() async => MydbModel._(await initialDatabase());

  static Future<UserDao> initialDatabase() async {
    var db = await $FloorAppDatabase.databaseBuilder('flutter_database.db').build();
    return db.userDao;
  }

  UserDao get userDao=>_userDao;
}

и основной класс:

main() async {
  var mydbModel = await MydbModel.create();

  print(mydbModel.userDao);
}

Мне нужно определить это только для метода main, и я не могу использовать его дляStatefulWidget или State<Classname классов, и когда я пытаюсь использовать этот экземпляр, я должен передать его для всех классов

enter image description here

как я могу решить эту проблемупроблема просто использовать класс во всей части приложения?

например:

main() {
  var userDao = MydbModel.create().then((dao){
    return dao;
  });

  print(userDao);
}

Ответы [ 2 ]

0 голосов
/ 10 июня 2019

Если вашему приложению требуется асинхронная загрузка данных перед тем, как они будут готовы для ввода пользователем, вам нужно будет показать некоторый пользовательский интерфейс во время загрузки.FutureBuilder обрабатывает такой случай.

Вот пример, показывающий счетчик, пока prepareData не закончится.Другой вариант - показать заставку.

Future prepareData() async => null;

...

  @override
  Widget build(BuildContext context) {
    return FutureBuilder(
      future: prepareData(),
      builder: (context, snapshot) {
        if (snapshot.hasData) {
          return Text('${snapshot.data}');
        } else if (snapshot.hasError) {
          return Text('${snapshot.error}');
        } else
          return Center(child: CircularProgressIndicator());
      },
    );
  }
0 голосов
/ 09 июня 2019

Попробуйте:

class MydbModel {
  static UserDao _userDao;

  MydbModel._();

  static UserDao get userDao =>_userDao;

  static Future<void> create() async => _userDao = await initialDatabase();

  static Future<UserDao> initialDatabase() async {
    var db = await $FloorAppDatabase.databaseBuilder('flutter_database.db').build();
    return db.userDao;
  }
}

Вы сможете получить доступ к _userDao из любого места, используя MydbModel.userDao.

...