【问题标题】:Dart make a singletone without using async and await outsideDart 在不使用 async 和 await 的情况下制作单例
【发布时间】:2019-10-24 05:28:26
【问题描述】:

我正在尝试使用默认构造函数从 MyDatabase 创建一个单例类,以访问此类上的 getUserDao,实现的代码工作正常,但我有一些其他问题,因为

  1. 我必须在课外使用asyncawait
  2. 我必须使用它 仅在 main 函数上,因为 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 方法上定义它,我不能在 StatefulWidgetState&lt;Classname 类上使用它,当我尝试使用这个实例时,我必须将它传递给所有类

如何解决这个问题,以便在应用程序的所有部分中使用简单的类?

例如:

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

  print(userDao);
}

【问题讨论】:

    标签: asynchronous flutter dart future


    【解决方案1】:

    如果您的应用需要在准备好供用户输入之前异步加载数据,则您必须在加载时显示一些 UI。 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());
          },
        );
      }
    

    【讨论】:

      【解决方案2】:

      试试这个:

      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;
        }
      }
      

      您应该可以在任何地方使用MydbModel.userDao 访问_userDao

      【讨论】:

      • 对于此代码:MydbModel.userDao.getUserInfo() 我收到此错误:The method 'getUserInfo' was called on null.
      • 你在调用MydbModel.userDao.getUserInfo()之前是否运行了await MydbModel.create();
      猜你喜欢
      • 2018-07-15
      • 2020-03-15
      • 2019-12-04
      • 2017-09-08
      • 2022-08-06
      • 2018-12-04
      • 2022-11-15
      • 2020-02-06
      • 1970-01-01
      相关资源
      最近更新 更多