![](/img/trans.png)
[英]Flutter SQLite database table exists but not detected by SQFLite
[英]State Management to hold the data in flutter for sqlite database using sqflite plugin?
我正在 flutter 中使用 sqflite 为 SQLite 数据库制作一个应用程序,在该应用程序中,用户可以保存他们的金融交易信息,如姓名、金额。 日期等我正在尝试显示 SQLite 数据库中两个日期之间保存的所有记录,为此,我创建了一个包含两个日期的表单。
我制作了以下 function 用于从我的数据库中获取记录:
Future<List<expense>> getExpenseDateWise() async {
final db = await database;
var expenses = await db
.rawQuery('SELECT * FROM EXPENSES WHERE DATE(DATETIME) >= ? AND DATE(DATETIME) <= ?',
['$FromDate','$ToDate']);
List<expense> expenseList = List<expense>();
expenses.forEach((currentExpense) {
expense expenses = expense.fromMap(currentExpense);
expenseList.add(expenses);
});
return expenseList;
}
这个 function 的目的是否正确? 现在我不知道如何在另一个屏幕上使用这个 function 显示。 我想显示这些交易,如下图所示: 我不知道如何显示它,就像它显示在图像中一样。
编辑1:
在尝试了@Usama Karim 提供的方法后,我实现了这样的:
return Provider(
create: (context) => dateWiseTransactions(),
child: MaterialApp(
debugShowCheckedModeBanner: false,
title: '$finalFrom - $finalTo',
theme: ThemeData(
primaryColor: Colors.lightBlueAccent,
),
final expense = await Provider.of<dateWiseTransactions>(context, listen: off).getExpenseDateWise()
),);
它给了我以下错误:
error: Expected to find ')'. (expected_token at [finance_manager] lib\viewExpenses\dateWise.dart:37)
error: Positional arguments must occur before named arguments. (positional_after_named_argument at [finance_manager] lib\viewExpenses\dateWise.dart:37)
error: Expected an identifier. (missing_identifier at [finance_manager] lib\viewExpenses\dateWise.dart:37)
所以我尝试了一种不同的方法:
class _dateWiseViewState extends State<dateWiseView> {
@override
void initState() {
super.initState();
DatabaseProvider.db.getExpenseDateWise().then(
(expenseList) {
BlocProvider.of<ExpenseBloc>(context).add(SetFoods(expenseList));
},
);
}
Widget build(BuildContext context) {
String finalFrom = DateFormat('yyyy-MM-dd').format(widget.fromDate);
String finalTo = DateFormat('yyyy-MM-dd').format(widget.toDate);
return Scaffold(
appBar: AppBar(
title: Text("$finalFrom - $finalTo"),
),
body: Container(
child: BlocConsumer<ExpenseBloc, List<expense>>(
builder: (context, expenseList) {
return ListView.separated(
itemBuilder: (BuildContext context, int index) {
expense expensess = expenseList[index];
return Container(
margin: const EdgeInsets.all(5.0),
padding: const EdgeInsets.all(10),
decoration: BoxDecoration(
color: index % 2 == 0 ? Colors.white : Colors.lightBlueAccent,
border: Border.all(width: 2,color: Colors.white),
borderRadius: BorderRadius.circular(15)
),
child: ListTile(
leading: CircleAvatar(
backgroundColor: Colors.indigo,
foregroundColor: Colors.white,
child: Text(
expensess.name
.substring(0, 1)
.toUpperCase(),
style: TextStyle(fontSize: 32, fontWeight: FontWeight.bold),
),
),
title: Text(
expensess.name ?? "Title",
style: TextStyle(
fontWeight: FontWeight.bold,
fontSize: 30,
color: Colors.black,
),
),
subtitle: Text(
"Amount: ${expensess.amount.toString()}"
"\nDate: ${expensess.pickedDate}\n"
,style: TextStyle(
fontStyle: FontStyle.italic,
fontSize: 20,
color: Colors.black,
),
),
onTap: () {
}
)
);
},
itemCount: expenseList.length,
separatorBuilder: (BuildContext context, int index) => Divider(color: Colors.black),
);
},
listener: (BuildContext context, expenseList) {},
),
),
);
}
}
但这也不起作用,如图像所示,请帮助我。
感谢您的回复
为此,您可以使用Provider package。
制作一个单独的 class 并将此方法添加到 class
class Expense {
Future<List<expense>> getExpenseDateWise() async {
final db = await database;
var expenses = await db
.rawQuery('SELECT * FROM EXPENSES WHERE DATE(DATETIME) >= ? AND DATE(DATETIME) <= ?',
['$FromDate','$ToDate']);
List<expense> expenseList = List<expense>();
expenses.forEach((currentExpense) {
expense expenses = expense.fromMap(currentExpense);
expenseList.add(expenses);
});
return expenseList;
}
}
用 Provider 包裹材料 class 并像这样实例化您的 class
Provider(
create: (_) => Expense()
child: Material( ...
现在您可以在应用程序中的任何位置使用此方法。 要获取该方法,请使用以下
final expense = await Provider.of<Expense>(context, listen: off).getExpenseDateWise()
现在使用具有List<expense>
数据的expense
变量
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.