简体   繁体   English

如何将数据从方法 _callLogs 传递到正文并打印?

[英]How do I pass data from method _callLogs to body and print it?

I'm new to using flutter framework and I want to pass call logs to my app so I can print them.我是使用 flutter 框架的新手,我想将调用日志传递给我的应用程序,以便我可以打印它们。 How do I do that?我怎么做?

class _QuoteListState extends State<QuoteList> {

   Future<bool>_callLogs() async {
     Iterable<CallLogEntry> entries = await CallLog.get();

   }

 @override
 Widget build(BuildContext context) {
   return Scaffold(
     backgroundColor: Colors.grey[200],
     appBar: AppBar(
       title: Text('Calls Log'),
       centerTitle: true,
       backgroundColor: Colors.purple,
     ),
     body: ListView.builder(
       itemCount: entries.length,
       itemBuilder: (context, index){

       }
     )
   );

you have to fetch data from async function and set to local variables so it is good to call setState inside the _callLogs as and make your widget stateful and write as below您必须从异步函数中获取数据并设置为局部变量,因此最好在 _callLogs 中调用 setState as 并使您的小部件有状态并编写如下

   import 'package:call_log/call_log.dart';
import 'package:flutter/material.dart';

void main() {
  runApp(MaterialApp(
    home: LogsList(),
  ));
}

class LogsList extends StatefulWidget {
  @override
  _LogsListState createState() => _LogsListState();
}

class _LogsListState extends State<LogsList> {
  @override
  void initState() {
    super.initState();
    _callLogs();
  }

  Future<void> _callLogs() async {
    Iterable<CallLogEntry> entries = await CallLog.get();
    List _data = entries.map((data) => data).toList();
    setState(() {
      _entries = _data;
    });
  }

  List<CallLogEntry> _entries = [];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.grey[200],
      appBar: AppBar(
        title: Text('Calls Log'),
        centerTitle: true,
        backgroundColor: Colors.purple,
      ),
      body: ListView.builder(
          itemCount: _entries.length,
          itemBuilder: (context, i) {
            final CallLogEntry callLogEntry = _entries[i];

            return ListTile(
              title: Text(callLogEntry.formattedNumber),
              subtitle: Text(callLogEntry.duration.toString()),
            );
          }),
    );
  }
}

make sure to add this to your project Android Manifest:确保将此添加到您的项目 Android 清单中:

You can use Future Builder to achieve so.您可以使用 Future Builder 来实现。

Following minimal code simulate you conditions, so you can implement in your own code.遵循最少的代码模拟您的条件,因此您可以在自己的代码中实现。

import 'package:flutter/material.dart';

class DeleteWidget extends StatefulWidget {
  const DeleteWidget({Key key}) : super(key: key);

  @override
  _DeleteWidgetState createState() => _DeleteWidgetState();
}

class _DeleteWidgetState extends State<DeleteWidget> {
  @override
  void initState() {
    super.initState();
  }

  List<int> _data;

  Future<bool> _callLogs() async {
    await Future.delayed(Duration(seconds: 4));
    _data = [6, 5, 4, 3, 2, 1];
    return true;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Container(
        child: Center(
          child: FutureBuilder(
            future: _callLogs(),
            builder: (context, snapshot) {
              if (!snapshot.hasError) {
                if (snapshot.data == true) {
                  return ListView.builder(
                    itemCount: _data.length,
                    itemBuilder: (context, index) {
                      return Text(_data[index].toString());
                    },
                  );
                } else {
                  return Text("Whatever when it returns false");
                }
              } else {
                return Text("Something wents wrong");
              }
            },
          ),
        ),
      ),
    );
  }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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