Flutter: ListView in a SimpleDialog

后端 未结 9 1687
深忆病人
深忆病人 2020-12-24 01:04

I want to show a SimpleDialog with ListView.builder in my Flutter app with this code:

showDialog(
  context: context,
  builder: (BuildContext context) {
           


        
9条回答
  •  爱一瞬间的悲伤
    2020-12-24 01:44

    This is a more general answer for future visitors.

    How to create a dialog with a list

    If you want a dialog with a ListView, you should consider a SimpleDialog. A SimpleDialog is designed to show options in a list (as opposed to an AlertDialog, which is meant to notify the user of something).

    Here is a simple example:

    The process of creating a SimpleDialog is basically the same as for an AlertDialog (they are both based on Dialog), except that you define list item widgets called SimpleDialogOptions instead of buttons. When a list option is pressed a callback is fired that you can respond to.

      // set up the list options
      Widget optionOne = SimpleDialogOption(
        child: const Text('horse'),
        onPressed: () {},
      );
      Widget optionTwo = SimpleDialogOption(
        child: const Text('cow'),
        onPressed: () {},
      );
      Widget optionThree = SimpleDialogOption(
        child: const Text('camel'),
        onPressed: () {},
      );
      Widget optionFour = SimpleDialogOption(
        child: const Text('sheep'),
        onPressed: () {},
      );
      Widget optionFive = SimpleDialogOption(
        child: const Text('goat'),
        onPressed: () {},
      );
    
      // set up the SimpleDialog
      SimpleDialog dialog = SimpleDialog(
        title: const Text('Choose an animal'),
        children: [
          optionOne,
          optionTwo,
          optionThree,
          optionFour,
          optionFive,
        ],
      );
    
      // show the dialog
      showDialog(
        context: context,
        builder: (BuildContext context) {
          return dialog;
        },
      );
    

    Handling option presses

    When a user clicks an item you can close the dialog an perform some action.

      Widget optionOne = SimpleDialogOption(
        child: const Text('horse'),
        onPressed: () {
          Navigator.of(context).pop();
          _doSomething();
        },
      );
    

    Notes

    • The documentation recommends using a switch to return an enum as a Future.
    • See also How to make an AlertDialog in Flutter?

    Code

    Here is the full code for the example above.

    main.dart

    import 'package:flutter/material.dart';
    
    void main() => runApp(MyApp());
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'SimpleDialog',
          home: Scaffold(
              appBar: AppBar(
                title: Text('SimpleDialog'),
              ),
              body: MyLayout()),
        );
      }
    }
    
    class MyLayout extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return Padding(
          padding: const EdgeInsets.all(8.0),
          child: RaisedButton(
            child: Text('Show alert'),
            onPressed: () {
              showAlertDialog(context);
            },
          ),
        );
      }
    }
    
    // replace this function with the examples above
    showAlertDialog(BuildContext context) {
    
      // set up the list options
      Widget optionOne = SimpleDialogOption(
        child: const Text('horse'),
        onPressed: () {
          print('horse');
          Navigator.of(context).pop();
        },
      );
      Widget optionTwo = SimpleDialogOption(
        child: const Text('cow'),
        onPressed: () {
          print('cow');
          Navigator.of(context).pop();
        },
      );
      Widget optionThree = SimpleDialogOption(
        child: const Text('camel'),
        onPressed: () {
          print('camel');
          Navigator.of(context).pop();
        },
      );
      Widget optionFour = SimpleDialogOption(
        child: const Text('sheep'),
        onPressed: () {
          print('sheep');
          Navigator.of(context).pop();
        },
      );
      Widget optionFive = SimpleDialogOption(
        child: const Text('goat'),
        onPressed: () {
          print('goat');
          Navigator.of(context).pop();
        },
      );
    
      // set up the SimpleDialog
      SimpleDialog dialog = SimpleDialog(
        title: const Text('Choose an animal'),
        children: [
          optionOne,
          optionTwo,
          optionThree,
          optionFour,
          optionFive,
        ],
      );
    
      // show the dialog
      showDialog(
        context: context,
        builder: (BuildContext context) {
          return dialog;
        },
      );
    }
    

提交回复
热议问题