【问题标题】:How to print listview in Flutter using data from List?如何使用 List 中的数据在 Flutter 中打印 listview?
【发布时间】:2021-08-03 13:18:32
【问题描述】:

我有一个步进表单,我用它来接收用户的输入。有 3 个步骤,在每个步骤中,用户提供输入,输入保存到保存按钮单击的列表中。现在,问题是,我可以在控制台上打印列表。但我不知道如何在按钮上方的屏幕上打印它,或者如果任何字段为空,我想在按钮上方显示错误消息。谁能帮帮我吗?我有以下代码。

import 'package:flutter/material.dart';

void main() => runApp(new MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'Flutter Stepper Demo',
      theme: new ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: new MyHomePage(title: 'Stepper Tutorial'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);
  final String title;

  @override
  _MyHomePageState createState() => new _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _currentStep = 0;
  TextEditingController nameController = TextEditingController();
  TextEditingController emailController = TextEditingController();
  TextEditingController addressController = TextEditingController();
  List<String> demoList = [];

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text(widget.title),
      ),
      body: Column(
        children: <Widget>[
          Stepper(
            steps: _mySteps(),
            currentStep: this._currentStep,
            onStepTapped: (step) {
              setState(
                () {
                  this._currentStep = step;
                },
              );
            },
            onStepContinue: () {
              setState(
                () {
                  if (this._currentStep < this._mySteps().length - 1) {
                    this._currentStep = this._currentStep + 1;
                  } else {
                    //Logic to check if everything is completed
                    print('Completed, check fields.');
                  }
                },
              );
            },
            onStepCancel: () {
              setState(
                () {
                  if (this._currentStep > 0) {
                    this._currentStep = this._currentStep - 1;
                  } else {
                    this._currentStep = 0;
                  }
                },
              );
            },
          ),
          ElevatedButton(
            onPressed: viewList,
            child: Text("Click to see List"),
          ),
        ],
      ),
    );
  }

  viewList() {
    if (nameController.text.isEmpty ||
        emailController.text.isEmpty ||
        addressController.text.isEmpty) {
      // //// Print Error message display in the screen above the button //
    } else {
      demoList.add(nameController.text);
      demoList.add(emailController.text);
      demoList.add(addressController.text);
    }
    print(demoList);
  }

  List<Step> _mySteps() {
    List<Step> _steps = [
      Step(
        title: Text('Step 1'),
        content: TextField(
          controller: nameController,
        ),
        isActive: _currentStep >= 0,
      ),
      Step(
        title: Text('Step 2'),
        content: TextField(
          controller: emailController,
        ),
        isActive: _currentStep >= 1,
      ),
      Step(
        title: Text('Step 3'),
        content: TextField(
          controller: addressController,
        ),
        isActive: _currentStep >= 2,
      )
    ];
    return _steps;
  }
}

【问题讨论】:

    标签: flutter dart flutter-web


    【解决方案1】:

    虽然我不确定是否可以通过 Step 完成,但我通常使用 FormTextFormField,您可以在其中为表单添加 validator 以检查值是否为空并发出警报带有消息的用户。示例:

    TextFormField(
                            validator: (value) {
                              if (value.isEmpty) {
                                return 'Please enter some text'; // the message which you alert the user that he needs to enter the value
                              }
                              return null;
                            },
                            keyboardType: TextInputType.text,
                          ),
    

    作为 listView 条件的一部分,您可以使用一些 if/switch case 或迭代器。在按钮上方放置一个小部件(ListView.builder),就像你所说的使用和 if/switch case 或迭代器一样:

    if (formIsEmpty){
    //logic when the form is empty
    } ? ListView.builder() : Cointainer()
    
    

    所以,让我试着解释一下。起初,它会在按钮上方显示一个空容器或您喜欢的任何其他小部件,但是当满足 ListView.builder 的逻辑时,您会触发 lisview 并根据需要显示列表。

    这通常与登录表单一起使用,当您错过密码时,会出现一个链接,用于重置密码等。

    bool _forgotPassword = false;
     _forgotPassword 
                ? TextButton(
                    onPressed: () async {
                      //await your logic for forgotton password
                    },
                    child: Text('Forgot Password'))
                : Container(),
    
    // ABOVE IS THE LOGIC FOR SHOWING THE WIDGET (IN YOUR CASE LISTVIEW.BUILDER) AFTER AN ACTION IS PERFORMED
            TextButton(
                onPressed: () async {
                  //await your login logic, if it returns false\error\not authenticated, then you can change the state of _forgotPassword, and then shows 'forgot password TextButton'
                  setState(() {
                    _forgotPassword = true;
                  });
                },
                child: Text('Login'))
    

    【讨论】:

    • 实际上,我知道如何将它与表单和验证一起使用。但在这种情况下,我只想使用 if 条件在按钮上方的列表视图构建器中打印(姓名、电子邮件和地址)列表(例如:if (DemoList.isNotEmpty){ Show Listview) else{Show error with listview ).. 那就是我要找的。​​span>
    • @GrandMagnus....感谢您的支持。我从你的帮助中得到了这个想法:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-14
    • 2017-07-26
    • 2021-07-21
    • 2015-03-18
    • 2020-08-19
    相关资源
    最近更新 更多