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 制作表单