Flutter извлекает асинхронный класс и методы разделителя - PullRequest
1 голос
/ 08 июня 2019

Мой репозиторий реализации

в main методе у меня есть эти строки кода для подключения к базе данных и отлично работает

Future<void> main() async {
  final database = await $FloorAppDatabase.databaseBuilder('flutter_database.db').build();

  final userDao = database.userDao;

  runApp(MaterialApp(...);
}

сейчас я пытаюсь использовать этот код

  final database = await $FloorAppDatabase.databaseBuilder('flutter_database.db').build();
  final userDao = database.userDao;

из класса, например:

Future<void> main() async {
  MyDatabase myDatabase = MyDatabase();
  final userDao = myDatabase.userDao;

  runApp(MaterialApp(...);
}

к сожалению, я получаю null для userDao в этой реализации, я думаю, что в этой ведьме я использую async я должен изменить это и использовать then()

class MyDatabase {
  UserDao userDao;

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

@dao
abstract class UserDao{
  @Query('SELECT * FROM User LIMIT 1')
  Stream<User> getUserInfo();

  @insert
  Future<void> insertUserInformation(User user);
}

ОБНОВЛЕНО: решение для реализации в области применения

class MydbModel extends Model {
  MyDatabase myDatabase = MyDatabase();
  Future _doneFuture;

  MydbModel()  {
    _doneFuture= myDatabase.initialDatabase();
  }

  Future get initializationDone => _doneFuture;
}

class MyDatabase {
  AppDatabase db;
  UserDao userDao;

  Future<void> initialDatabase() async {
    db = await $FloorAppDatabase.databaseBuilder('flutter_database.db').build();
  }

  UserDao getUserDao() {
    return db.userDao;
  }
}

main() {
  runApp(MaterialApp(
    title: 'floor sample',
    home: App(),
  ));
}

class App extends StatefulWidget {
  App({Key key}) : super(key: key);

  @override
  State<App> createState() => _AppState();
}

class _AppState extends State<App> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: ScopedModel(
        model: MydbModel(),
        child: ScopedModelDescendant<MydbModel>(
          builder: (context, _, model) => StreamBuilder<User>(
            stream: model.myDatabase.userDao.getUserInfo(),
            builder: (_, snapshot) {
              if (!snapshot.hasData) {
                return Text('user not found');
              } else {
                return Text('user found');
              }
            },
          ),
        ),
      ),
    );
  }
}

1 Ответ

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

В данной реализации класса вы должны вызвать функцию и дождаться ее завершения:

MyDatabase myDatabase = MyDatabase();
final userDao = await myDatabase.initialDatabase();

В качестве альтернативы, если вы не хотите каждый раз воссоздавать экземпляр базы данных, рассмотрите возможность присвоения его члену класса.

class MyDatabase {
  AppDatabase db;

  Future<void> initDb() async {
    db = await $FloorAppDatabase.databaseBuilder('flutter_database.db').build();
  }

  UserDao getUserDao() {
    return db.userDao;
  }

  // here may be other functions that use db
}

И использовать его вот так

MyDatabase myDatabase = MyDatabase();
await myDatabase.initDb();
final userDao = myDatabase.getUserDao();
// here you can call other functions from class
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...