【问题标题】:State Management to hold the data in flutter for sqlite database using sqflite plugin?状态管理使用 sqflite 插件为 sqlite 数据库保存数据?
【发布时间】:2021-07-21 18:05:41
【问题描述】:

我正在使用 sqflite 为 SQLite 数据库制作一个应用程序,在该应用程序中,用户可以保存他们的金融交易信息,如姓名、金额。日期等我试图在 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;
}

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

编辑 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) {},
       ),
     ),
   );
  }
}

但这也不起作用,如图片中所示,请帮助我。

感谢您的回复

【问题讨论】:

标签: sqlite flutter dart android-database sqflite


【解决方案1】:

您可以为此使用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 包装材质类并像这样实例化你的类

Provider( 
create: (_) => Expense() 
child: Material( ...

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

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

现在使用具有List&lt;expense&gt; 数据的expense 变量

【讨论】:

  • 你好@Usama Karim,谢谢你的回复我试过你的方法它不起作用,我已经更新了问题请帮助我,谢谢
  • 我在代码中也写了错误,请帮助我
  • 你能用我的方法展示你的代码吗?展示你制作的课程以及你是如何使用它的?
猜你喜欢
  • 2021-05-30
  • 1970-01-01
  • 2021-07-09
  • 1970-01-01
  • 2020-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多