如何将数据从AlertDialog传递到扑朔迷离的页面



我将数据从我的aleraldialog传递给listView项目。

我可以在哪里找到有关它的信息?

我尝试使用带有导航路由的TextedingController。我使用了本教程中的材料

这是我的代码:

    class MeasurementsScreen extends StatefulWidget {
  @override
  _MeasurementsScreenState createState() => _MeasurementsScreenState();
}

class _MeasurementsScreenState extends State<MeasurementsScreen> {
  List<_ListItem> listItems;
  String lastSelectedValue;
  var name = ["Рост", "Вес"];
  var indication = ["Введите ваш рост", "Введите ваш вес"];
  TextEditingController customcintroller;
  void navigationPageProgrammTrainingHandler() {
    Navigator.of(context).push(MaterialPageRoute(
        builder: (BuildContext context) => ProgrammTrainingHandler()),
    );
  }
  @override
  void initState() {
    super.initState();
    initListItems();
  }
  Future<String> createAlertDialog(BuildContext context, int indexAl){
    customcintroller = TextEditingController();
    if(indexAl < 2){
      return showDialog(context: context, builder: (context){
        return AlertDialog(
          title: Text(name[indexAl]),
          content: TextField(
            textDirection: TextDirection.ltr,
            controller: customcintroller,
            style: TextStyle(
                color: Colors.lightGreen[400],
                fontSize: 18.5),
            decoration: InputDecoration(
              contentPadding: EdgeInsets.only(bottom: 4.0),
              labelText: indication[indexAl],
              alignLabelWithHint: false,
            ),
            keyboardType: TextInputType.phone,
            textInputAction: TextInputAction.done,
          ),
          actions: <Widget>[
            FlatButton(
              child: const Text('ОТМЕНА'),
              onPressed: () {
                Navigator.of(context).pop();
              },
            ),
            FlatButton(
              child: const Text('ОК'),
              onPressed: () {
                Navigator.of(context).pop(customcintroller.text.toString());
              },
            ),
          ],
        );
      });
    } else if (indexAl > 1){
      navigationPageProgrammTrainingHandler();
    }
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      backgroundColor: Color(0xff2b2b2b),
      appBar: AppBar(
        title: Text(
          'Замеры',
          style: new TextStyle(
            color: Colors.white,
          ),),
        leading: IconButton(
          icon:Icon(Icons.arrow_back),
          color: Colors.white ,
          onPressed:() => Navigator.of(context).pop(),
        ),
      ),
      body: ListView.builder(
        physics: BouncingScrollPhysics(),
        itemCount: listItems.length,
        itemBuilder: (BuildContext ctxt, int index){
          return GestureDetector(
              child: listItems[index],
              onTap: () {
                  createAlertDialog(context, index).then((onValue){
                  });
              }
          );
        },
      ),
    );
  }
  void initListItems() {
    listItems = [
      new _ListItem(
          bgName: 'assets/images/soso_growth.jpg',
          name: customcintroller.text.toString().isEmpty == false ? customcintroller.text.toString() : "Рост",
          detail: "Нажми, чтобы добавить свой рост"),
      new _ListItem(
          bgName: 'assets/images/soso_weight.jpg',
          name: customcintroller.text.toString().isEmpty == false ? customcintroller.text.toString() :  "Вес",
          detail: "Нажми, чтобы добавить свой вес"),
      new _ListItem(
          bgName: 'assets/images/soso_chest.jpg',
          name: "Грудь",
          detail: "PRO-версия"),
      new _ListItem(
          bgName: 'assets/images/soso_shoulder.jpg',
          name: "Плечи",
          detail: "PRO-версия"),
      new _ListItem(
          bgName: 'assets/images/soso_biceps.jpg',
          name: "Бицепс",
          detail: "PRO-версия")
    ];
  }
}
class _ListItem extends StatelessWidget {
  _ListItem({this.bgName, this.name, this.detail});
  // final int index;
  final String bgName;
  final String name;
  final String detail;
  @override
  Widget build(BuildContext context) {
    return Container(
      height: 180.0,
      margin: const EdgeInsets.symmetric(
        vertical: 1.0,
      ),
      child: new Stack(
        children: <Widget>[
          new Container(
            decoration: new BoxDecoration(
              image: new DecorationImage(
                  image: new AssetImage(bgName),
                  colorFilter: new ColorFilter.mode(
                      Colors.black.withOpacity(0.45), BlendMode.darken),
                  fit: BoxFit.cover,
                  alignment: Alignment.center),
            ),
            child: new SizedBox.expand(
              child: Container(
                alignment: Alignment.center,
                child: new Column(
                  mainAxisAlignment: MainAxisAlignment.center,
                  crossAxisAlignment: CrossAxisAlignment.center,
                  mainAxisSize: MainAxisSize.min,
                  children: <Widget>[
                    new Text(
                      name,
                      style: new TextStyle(fontSize: 29.0, color: Colors.white),
                    ),
                    Padding(
                      padding: const EdgeInsets.only(top: 12.0),
                      child: new Text(
                        detail,
                        style:
                        new TextStyle(fontSize: 16.0, color: Colors.white),
                      ),
                    )
                  ],
                ),
              ),
            ),
          ),
        ],
      ),
    );
  }
}

我希望从AlertDialog获得文本。

您是否要在当前屏幕或其他脚手架/屏幕中更新数据?第一个选项的解决方案是将所需的数据设置为设定状态,或将其传递到模型(带有ScopedModel(并更新视图。例如。:

FlatButton(
              child: const Text('ОТМЕНА'),
              onPressed: () {
                setState(() {
                   myData = data;
                   Navigator.of(context).pop(); 
                  }); // not sure if this will work, could you try?
            }
            ),

如果它在新的/其他屏幕中,则可以在导航器中传递,例如:

Navigator.push(
          context,
          MaterialPageRoute(
            builder: (context) => NewScreen(data: myData),
          ),
        );
      },

这可以解决您的问题吗?否则,请详细说明您需要的内容。

我尝试在AlertDialog中使用Navigator.of(context).pop("OK");,但它不起作用。将ValueChanged用作Showdialog方法的参数,并且效果很好。

class Dialogs{
static showAlertDialog(BuildContext context, String title, String message,
      {List<String> actions, ValueChanged onChanged}) async {
    if (actions == null) {
      actions = ["OK"];//default OK button.
    }
    await showDialog(
      context: context,
      child: AlertDialog(
        title: Text(title ?? 'Message'),
        content: Text(message),
        actions: actions
            .map((e) => new FlatButton(
                child: Text(e.trim()),
                onPressed: () {
                  Navigator.of(context).pop(e.trim());
                  if (onChanged != null) {
                    onChanged(e.trim());
                  }
                }))
            .toList(),
      ),
    );
  }
}

呼叫者看起来像

_onProcess(){
        String result = "";
        await Dialogs.showAlertDialog(context, "Warning", "Warning message", actions: ["OK", "Cancel"],
            onChanged: (value) {
          result = value;
        });
        if (result != "OK") {
          Dialogs.showSnackBarMessage(context, "Cancel This PTN");
          return;
        }
        ....process with the OK logic.
}

如果要更改列表的项目,则可以在调用Navigator.pop((之前使用setState((执行此操作。但是,由于您可以使用navigator.push(... mypage(data((。

您可以通过国家管理实现所需的目标。您可以一般检查国家管理教程。但是我认为最使用的两种实践是范围的模型和集体模式。这些实践可帮助您向后和向前传递小部件树。我建议集体模式有很多教程。还有一个包裹对集体图案非常有帮助:Flutter_Bloc。

相关内容

  • 没有找到相关文章

最新更新