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

Я пытаюсь реализовать библиотеку Floor , которая является оберткой для sqflite, приведенный ниже код работает без проблем, но я хочу сделать ScopeModel из этой реализации, но в этой userDao.getUserInfo() возврат NULL

эта реализация работает нормально:

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

  runApp(MaterialApp(
    title: Strings.appName,
    theme: ThemeData(
      primarySwatch: Colors.indigo,
    ),
    home: App(userDao: userDao),
  ));
}

class App extends StatefulWidget {
  final UserDao userDao;

  App({Key key, @required this.userDao}) : super(key: key);

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

class _AppState extends State<App> {
  UserDao get _userDao => widget.userDao;

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

  @override
  void dispose() {
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Container(
        child: StreamBuilder<User>(
          stream: _userDao.getUserInfo(),
          builder: (_, snapshot) {
            if (!snapshot.hasData)
              return Center(child: Text('NULL'));
            else {
              return Center(child: Text('user registered'));
            }
          },
        ),
      ),
    );
  }
}

и моя реализация для использования ScopeModel

UserDao класс:

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

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

MyDatabase класс:

class MyDatabase {
  UserDao userDao;

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

    return database.userDao;
  }
}

DataBaseModel класс:

class DataBaseModel extends Model{
  MyDatabase myDatabase = MyDatabase();

  DataBaseModel(){
    initialDatabase();
  }

  void initialDatabase() async{
    myDatabase.userDao = await myDatabase.initialDatabase();
  }
}

и использовать тему в классе виджетов с getUserInfo return null

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: ScopedModel(
        model: DataBaseModel(),
        child: ScopedModelDescendant<DataBaseModel>(
          builder: (context, _, model) => StreamBuilder<User>(
            stream: model.myDatabase.userDao.getUserInfo(),
            builder: (_, snapshot) {
              if (!snapshot.hasData) {
                return Text('aaaaaaaa');
              } else {
                return Text('bbbbbb');
              }
            },
            ),
        ),
      ),
    );
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...