繁体   English   中英

State 使用 sqflite 插件管理 sqlite 数据库在 flutter 中的数据?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM