Listview 标题:文本(“SimpleDialog”), ), 正文:MyLayout()), ); } } 类MyLayout扩展了无状态小部件{ @凌驾 小部件构建(构建上下文){ 返回填充( 填充:常数边集全部(8.0), 孩子:升起按钮( 子项:文本(“显示警报”), 已按下:(){ showAlertDialog(上下文); }, ), ); } } //用上述示例替换此函数 showAlertDialog(构建上下文){ //设置列表选项 Widget optionOne=SimpleDialogOption( 子项:常量文本(“马”), 已按下:(){ 印刷品(“马”); Navigator.of(context.pop(); }, ); Widget optionTwo=simpledialogooption( 子项:const Text('cow'), 已按下:(){ 印刷品(“奶牛”); Navigator.of(context.pop(); }, ); 小部件选项树=SimpleDialog选项( 子项:常量文本('camel'), 已按下:(){ 印刷品(“骆驼”); Navigator.of(context.pop(); }, ); 小部件选项四=SimpleDialogOption( 子项:const Text('sheep'), 已按下:(){ 印刷品(“羊”); Navigator.of(context.pop(); }, ); Widget optionView=SimpleDialogOption( 子项:const Text('goat'), 已按下:(){ 印刷品(“山羊”); Navigator.of(context.pop(); }, ); //设置SimpleDialog SimpleDialog=SimpleDialog( 标题:常量文本(“选择动物”), 儿童:[ optionOne, 选项二, 选择树, 选择四, optionFive, ], ); //显示对话框 显示对话框( 上下文:上下文, 生成器:(BuildContext上下文){ 返回对话框; }, ); }

Listview 标题:文本(“SimpleDialog”), ), 正文:MyLayout()), ); } } 类MyLayout扩展了无状态小部件{ @凌驾 小部件构建(构建上下文){ 返回填充( 填充:常数边集全部(8.0), 孩子:升起按钮( 子项:文本(“显示警报”), 已按下:(){ showAlertDialog(上下文); }, ), ); } } //用上述示例替换此函数 showAlertDialog(构建上下文){ //设置列表选项 Widget optionOne=SimpleDialogOption( 子项:常量文本(“马”), 已按下:(){ 印刷品(“马”); Navigator.of(context.pop(); }, ); Widget optionTwo=simpledialogooption( 子项:const Text('cow'), 已按下:(){ 印刷品(“奶牛”); Navigator.of(context.pop(); }, ); 小部件选项树=SimpleDialog选项( 子项:常量文本('camel'), 已按下:(){ 印刷品(“骆驼”); Navigator.of(context.pop(); }, ); 小部件选项四=SimpleDialogOption( 子项:const Text('sheep'), 已按下:(){ 印刷品(“羊”); Navigator.of(context.pop(); }, ); Widget optionView=SimpleDialogOption( 子项:const Text('goat'), 已按下:(){ 印刷品(“山羊”); Navigator.of(context.pop(); }, ); //设置SimpleDialog SimpleDialog=SimpleDialog( 标题:常量文本(“选择动物”), 儿童:[ optionOne, 选项二, 选择树, 选择四, optionFive, ], ); //显示对话框 显示对话框( 上下文:上下文, 生成器:(BuildContext上下文){ 返回对话框; }, ); },listview,flutter,Listview,Flutter,将ListView包装在容器中并给它一个宽度:double.maxFinite,可以解决iOS/Android在对话框中使用ListView时遇到的问题: showDialog( context: context, builder: (BuildContext context) { return AlertDialog( content: Container( width: double.maxFinite,

将ListView包装在容器中并给它一个宽度:double.maxFinite,可以解决iOS/Android在对话框中使用ListView时遇到的问题:

showDialog(
   context: context,
   builder: (BuildContext context) {
      return AlertDialog(
         content: Container(
            width: double.maxFinite,
            child: ListView(
               children: <Widget>[]
            ),
         ),
      );
   }
);
showDialog(
上下文:上下文,
生成器:(BuildContext上下文){
返回警报对话框(
内容:容器(
宽度:double.maxFinite,
子:ListView(
儿童:[]
),
),
);
}
);
对于AlertDialog内的列中的ListView:

showDialog(
   context: context,
   builder: (BuildContext context) {
      return AlertDialog(
         content: Container(
            width: double.maxFinite,
            child: Column(
               mainAxisSize: MainAxisSize.min,
               children: <Widget>[
                  Expanded(
                     child: ListView(
                        shrinkWrap: true,
                        children: <Widget>[]
                     )
                  )
               ]
            ),
         ),
      );
   }
);
showDialog(
上下文:上下文,
生成器:(BuildContext上下文){
返回警报对话框(
内容:容器(
宽度:double.maxFinite,
子:列(
mainAxisSize:mainAxisSize.min,
儿童:[
扩大(
子:ListView(
收缩膜:对,
儿童:[]
)
)
]
),
),
);
}
);
showDialog(上下文:parentcontext,
生成器:(上下文){
返回SimpleDialog(
标题:文本(“创建帖子”),
儿童:[
简单幻觉(
onPressed:handleImageTaking,
child:Text('take a pic'),
),
简单幻觉(
按下:手动图像选择,
子项:文本(“选择图片”),
),
简单幻觉(
子项:文本('cancel'),
已按下:(){
Navigator.pop(上下文);
},
)
],
);
});

在ListView中将
SingleChildScrollView
物理:NeverScrollableScrollPhysics()
收缩包装:true
一起使用

  showDialog(
      context: context,
      builder: (_) {
        return AlertDialog(
          title: widget,
          content: SingleChildScrollView( //MUST TO ADDED
            child: Column(
              mainAxisSize: MainAxisSize.min,
              children: [
                ...//any widgets,
                ListView.builder(
                    shrinkWrap: true, //MUST TO ADDED
                    physics: NeverScrollableScrollPhysics(), //MUST TO ADDED
                    itemCount: model.length,
                    itemBuilder: (BuildContext c, int index) {
                      return ListTile();
                    })
              ],
            ),
          ),
        );
      },
    );

只需在
内容中
我们需要使用高度和宽度固定的
容器
。 并将
列表视图
用作
容器
的子级

 scrollDialogFunction(){
        return showDialog(
            context: context,
            builder: (BuildContext context) {
              return AlertDialog(
                title: Text('List of Index'),
                content: Container(
                  width: 350.0,
                  height: 250,// Change as per your requirement
                  child: ListView.builder(
                    itemCount: 150,
                    itemBuilder: (BuildContext context, int index) {
                      return ListTile(
                        title: Text(index.toString()),
                      );
                    },
                  ),
                ),
                actions: [Padding(
                  padding: const EdgeInsets.all(8.0),
                  child: Text("ok",style: TextStyle(fontSize: 18),),
                )],
              );
            });
      }

width:double.maxFinite
添加到
容器中
解决了我的问题

 @override
  Widget build(BuildContext context) {
    return AlertDialog(
      title: Text('Sample Dialog'),
      content: Container(
        width: double.maxFinite,
        child: ListView(
          children: <Widget>[
            Text('Item 1'),
            Text('Item 2'),
          ],
        ),
      ),
    );
  }
@覆盖
小部件构建(构建上下文){
返回警报对话框(
标题:文本(“示例对话框”),
内容:容器(
宽度:double.maxFinite,
子:ListView(
儿童:[
文本(“第1项”),
正文(“第2项”),
],
),
),
);
}

使用
扩展运算符(…)
迭代列表,或者如果列表可以为空,则使用
空感知扩展运算符(…?)

列出值=['1'、'2'、'3'];
等待显示对话框(
上下文:上下文,
生成器:(BuildContext上下文){
返回SimpleDialog(
标题:文本(“选择值”),
儿童:[
…values.map((值){
返回SimpleDialogOption(子项:文本(值));
}),
],
);
},
);
输出:


@Jus10否,使用FullscreenDialog代替标题只需要高度或宽度,而不是两者。我需要同时填充高度和宽度?为什么呢@拉比也需要这两个,谢谢你。除此之外,单击该选项时如何关闭对话框?@Emen:您可以使用
Navigator.of(context.pop())关闭对话框@AntonDuzenko你说得对,我写的警报对话框有一个子参数,但它确实是内容。不管怎样,它对你有用吗?对于我来说,工作就像一个charmI在一个应用程序中使用ListView时遇到了这种方法的问题Column@AntonDuzenko我在一个专栏中也尝试过这个方法,我更新了示例并添加了“Container(width:double.maxFinite,wrapper”上面的专栏解决了这个问题。似乎没有这个选项的对话框只适用于新的Android版本,如9.0。@Jose Jet我发现它不再适用于ios应用程序。listview.builder不可滚动。
  @override
  dispose() { super.dispose();
    SystemChrome.setPreferredOrientations([
      DeviceOrientation.landscapeRight,
      DeviceOrientation.landscapeLeft,
      DeviceOrientation.portraitUp,
      DeviceOrientation.portraitDown,
    ]);
  }
@override
Widget build(BuildContext context) {
  double width = MediaQuery.of(context).size.width;
  double height = MediaQuery.of(context).size.height;
 return ConstrainedBox(
    constraints: BoxConstraints(maxHeight: height, maxWidth: width),
    child: Column(
      children: <Widget>[
        Expanded(
          child: GridView.count(
            primary: false,
            padding: const EdgeInsets.all(20.0),
            crossAxisSpacing: 10.0,
            crossAxisCount: 3,
            children: _images
          )
        ),
      ]
    ),
  );
}
showDialog(
  context: context,
  builder: (BuildContext context) {
    return new SimpleDialog(
      children: <Widget>[
        new Container(
          height: 100.0,
          width: 100.0,
          child: new ListView(
            children: <Widget>[
              new Text("one"),
              new Text("two"),
            ],
          ),
        )
      ],
    );
  },
);
  // 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: <Widget>[
      optionOne,
      optionTwo,
      optionThree,
      optionFour,
      optionFive,
    ],
  );

  // show the dialog
  showDialog(
    context: context,
    builder: (BuildContext context) {
      return dialog;
    },
  );
  Widget optionOne = SimpleDialogOption(
    child: const Text('horse'),
    onPressed: () {
      Navigator.of(context).pop();
      _doSomething();
    },
  );
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: <Widget>[
      optionOne,
      optionTwo,
      optionThree,
      optionFour,
      optionFive,
    ],
  );

  // show the dialog
  showDialog(
    context: context,
    builder: (BuildContext context) {
      return dialog;
    },
  );
}
showDialog(
   context: context,
   builder: (BuildContext context) {
      return AlertDialog(
         content: Container(
            width: double.maxFinite,
            child: ListView(
               children: <Widget>[]
            ),
         ),
      );
   }
);
showDialog(
   context: context,
   builder: (BuildContext context) {
      return AlertDialog(
         content: Container(
            width: double.maxFinite,
            child: Column(
               mainAxisSize: MainAxisSize.min,
               children: <Widget>[
                  Expanded(
                     child: ListView(
                        shrinkWrap: true,
                        children: <Widget>[]
                     )
                  )
               ]
            ),
         ),
      );
   }
);
showDialog(context: parentcontext,
    builder: (context){
      return SimpleDialog(
        title: Text('create post'),
        children: <Widget>[
          SimpleDialogOption(
            onPressed: handleImageTaking,
            child: Text('take a pic'),
          ),
          SimpleDialogOption(
            onPressed: handleImageSelecting,
            child: Text('select a pic'),
          ),
          SimpleDialogOption(
            child: Text('cancel'),
            onPressed: (){
              Navigator.pop(context);
            },
          )
        ],
      );
    });
  showDialog(
      context: context,
      builder: (_) {
        return AlertDialog(
          title: widget,
          content: SingleChildScrollView( //MUST TO ADDED
            child: Column(
              mainAxisSize: MainAxisSize.min,
              children: [
                ...//any widgets,
                ListView.builder(
                    shrinkWrap: true, //MUST TO ADDED
                    physics: NeverScrollableScrollPhysics(), //MUST TO ADDED
                    itemCount: model.length,
                    itemBuilder: (BuildContext c, int index) {
                      return ListTile();
                    })
              ],
            ),
          ),
        );
      },
    );
 scrollDialogFunction(){
        return showDialog(
            context: context,
            builder: (BuildContext context) {
              return AlertDialog(
                title: Text('List of Index'),
                content: Container(
                  width: 350.0,
                  height: 250,// Change as per your requirement
                  child: ListView.builder(
                    itemCount: 150,
                    itemBuilder: (BuildContext context, int index) {
                      return ListTile(
                        title: Text(index.toString()),
                      );
                    },
                  ),
                ),
                actions: [Padding(
                  padding: const EdgeInsets.all(8.0),
                  child: Text("ok",style: TextStyle(fontSize: 18),),
                )],
              );
            });
      }
 @override
  Widget build(BuildContext context) {
    return AlertDialog(
      title: Text('Sample Dialog'),
      content: Container(
        width: double.maxFinite,
        child: ListView(
          children: <Widget>[
            Text('Item 1'),
            Text('Item 2'),
          ],
        ),
      ),
    );
  }
List<String> values = ['one', 'two', 'three'];
    await showDialog(
      context: context,
      builder: (BuildContext context) {
        return SimpleDialog(
          title: Text("Select Value"),
          children: [
            ...values.map((value) {
              return SimpleDialogOption(child: Text(value));
            }),
          ],
        );
      },
    );