状态管理使用 sqflite 插件将数据保存在 flutter 数据库中?

问题描述

我正在使用 sqflite 为 sqlite 数据库制作一个 Flutter 应用程序,在该应用程序中,用户可以保存他们的财务交易信息,如姓名、金额。日期等我试图显示 sqlite 数据库中两个日期之间保存的所有记录,为此,我创建了一个包含两个日期的表单。

我做了以下函数来从我的数据库获取记录:

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

这个功能是否正确? 现在我不知道如何在另一个屏幕上使用此功能进行显示。 我想显示那些交易,如下图所示:

show

我不知道如何像显示在图像中那样显示它。

编辑 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,onTap: () {
                          }
                      )
                  );
                },itemCount: expenseList.length,separatorBuilder: (BuildContext context,int index) => Divider(color: Colors.black),);
          },listener: (BuildContext context,expenseList) {},);
  }
}

datewiseList

但这也不能像图片那样工作,请帮助我。

感谢您的回复

解决方法

您可以为此使用 Provider 包。

创建一个单独的类并在该类中添加此方法

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( 
create: (_) => Expense() 
child: Material( ...

现在您可以在应用内的任何位置使用此方法。要获取该方法,请使用以下内容

 final expense = await Provider.of<Expense>(context,listen: off).getExpenseDateWise()

现在使用具有 expense 数据的 List<expense> 变量