Flutter Provider 和 sqflite 集成

Posted

技术标签:

【中文标题】Flutter Provider 和 sqflite 集成【英文标题】:Flutter Provider and sqflite integration 【发布时间】:2021-11-22 06:01:35 【问题描述】:

我在 Flutter 应用中有一个 sqflite 表来存储用户详细信息。对于我正在使用提供程序的应用程序的状态管理。我在这个应用程序中有两个模型,一个用于 api 调用,另一个用于 sqflite 表。

这是从api获取用户数据的模型

// PS. The class structure
    class UserDetails 
      String? id;
      bool? mobileVerified;
      String? resentOtp;
      String? email;
      String? regmail;
      List<UserDeviceDetails>? deviceDetails;
      List<UserLocationDetails>? locationDetails;
      List<String>? deviceId;
      String? userValidCode;
      String? leadstatus;
      bool? dailyMail;
      bool? weeklyMail;
      bool? promotionalMail;
      bool? trValid;
      String? userType;
      String? createdAt;
      String? updatedAt;
      int? otp;
      bool? emailVerified;
      List<UserAccount>? accounts;
    

用户表的模型如下

class UserTable 
  int? id;
  String? accountDetails;
  String? accountId;
  String? childName;
  String? childGender;
  int? expiry;
  int? finalSequenceNo;
  int? packageIndex;
  String? parentName;
  String? productType;
  String? userId;
  int? age;
  int? dob;
  int? nextSyncTime;
  String? productSubType;
  String? validTill;
  int? latestUpdatePkgSeqNo;
  int? guidedTour;

用于检查(在启动画面内)用户是否已登录和路由,我依赖于这个用户表,并且还从这个表向提供者推送值。

 _dbHelper.getAllUserData().then((value) 
      String routeName = value.length > 0
          ? HomeScreen.routeName
          : IntroductionScreen.routeName;
      print('navigate to next page' + routeName);
      if(value.length>0)
        Provider.of<UserProvider>(context,listen: false).setuserProvider(value[0]);
      

如果表中存在值,上述代码会将值推送给提供者。我遇到的问题是用户第一次登录时(现在我需要重新启动应用程序以供提供商获取值)。我希望在将数据存储到用户表的同时将值推送到提供程序中。提供者如下所示。

class UserProvider with ChangeNotifier
  UserTable? user;
  void setuserProvider(UserTable userdata)
    user=userdata;
    notifyListeners();
  

  UserTable? get userdata
    return user;
  


  //Function to insert details inside user table
  Future  _insertuserDetails(UserDetails? userDetails) async
      if(userDetails != null)
         await _dbhelper!.insertUserDetails(userDetails);

我使用 insertfunction 将 userdetails 的值插入到 userTable(table)。如何将其传递给提供者

【问题讨论】:

【参考方案1】:

您可以在用户登录时使用相同的功能(即您的登录屏幕)。也许您的问题是如何在初始屏幕和登录屏幕中超出提供程序。 我没有清楚地了解您的问题,但以下内容可能会对您有所帮助

    将您的提供程序放在 AppState() 类中的“main.dart”上 现在您可以在登录屏幕中访问它并在用户点击提交按钮时存储价值。

“main.dart”文件

Future<void> main() async 
  runApp(MyApp());


 @override
  Widget build(BuildContext context) 
    return MultiProvider(
        providers: [
        ChangeNotifierProvider(
            create: (context) => YourProvider(),
          ),
          ],child:
        MaterialApp(
      title: 'MyApp',
      home: SplashScreen(),
      routes: 
      AppConstant.ROUTE_LOGIN_SCREEN: (ctx) => LOGINSCREEN(),
      
      )
    ) 
    
    
 

“登录.dart” onSubmit 按下

onPressed:()
// make function for user input
 Provider.of<UserProvider>(context,listen: false).setuserProvider("your value");

【讨论】:

取值来自api,形式为userDetail。提供者包含模型 UserTable 。因此,将价值从用户表推送到提供者是有效的。在登录期间,我需要同样的。我的意思是数据来自 userDetail 我想以 UserTable 的形式推送给提供者 那么您必须手动将 userDetail 模型中的值分配给 UserTable。然后在函数中传递值。前任。 userDetail.id = UserTable.id;

以上是关于Flutter Provider 和 sqflite 集成的主要内容,如果未能解决你的问题,请参考以下文章

flutter_bloc/provider RepositoryProvider vs Provider

Flutter 用 provider 和 riverpod 制作表单

在 Flutter 中使用 Provider 更新和动画化 AnimatedList

Flutter Provider 原理解析

Flutter跨组件共享状态的利器Provider简析

Flutter跨组件共享状态的利器Provider框架简析