Mwase
Mwase

Reputation: 1062

Showing a dialog that is in another file in flutter app

I'm trying to show a dialog box that is in another file in a StatefullWidget but when I call its function nothing is happening.

The reason I want to do this is because there is too much nesting of code in my code so I want to keep things simple and clean.

Below is the dialog.dart file.

import 'package:flutter/material.dart';

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

  @override
  _PersonDetailsDialogState createState() {
    return _PersonDetailsDialogState();
  }
}

class _PersonDetailsDialogState extends State<PersonDetailsDialog> {
  @override
  Widget build(BuildContext context) {
    Future<void> _neverSatisfied() async {
      return showDialog<void>(
        context: context,
        barrierDismissible: false, // user must tap button!
        builder: (BuildContext context) {
          return AlertDialog(
            title: Text('Rewind and remember'),
            content: SingleChildScrollView(
              child: ListBody(
                children: <Widget>[
                  Text('You will never be satisfied.'),
                  Text('You\’re like me. I’m never satisfied.'),
                ],
              ),
            ),
            actions: <Widget>[
              FlatButton(
                child: Text('Regret'),
                onPressed: () {
                  Navigator.of(context).pop();
                },
              ),
            ],
          );
        },
      );
    }
  }
}

Below is the main.dart file.

mport 'package:flutter/material.dart';
import 'package:practical_0/homepage.dart';

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

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

Below is homepage.dart file where I'm trying to show the dialog when the user clicks RaisedButton but nothing happens.

import 'package:flutter/material.dart';

class Homepage extends StatelessWidget {

  final double heightFactor = 600/896;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Container(
        child: RaisedButton(
          onPressed: PersonDetailsDialog(), // show dialog
        ),
      ),
    );
  }
}

Upvotes: 3

Views: 4047

Answers (2)

hackemate
hackemate

Reputation: 537

Here is an example:

Show dialog is an async function

child: RaisedButton(
              onPressed: () async{
              final result = await showDialog(
                context: context,
                builder: (_) => AlertWidget(),
              );
              return result;
            },

Upvotes: 5

Viren V Varasadiya
Viren V Varasadiya

Reputation: 27207

You have to use ShowDialog Where You want to show dialog.

I hope that following example clear your idea.

class Delete extends StatefulWidget {
  @override
  _DeleteState createState() => _DeleteState();
}

class _DeleteState extends State<Delete> {
  BuildContext parent, child;

  @override
  Widget build(BuildContext context) => Scaffold(
        body: Container(
          child: Center(
            child: RaisedButton(
              onPressed: () {
                showDialog(
                    context: context,
                    barrierDismissible: false,
                    child: PersonDetailsDialog());
              }, // show dialog
            ),
          ),
        ),
      );
}

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

  @override
  _PersonDetailsDialogState createState() {
    return _PersonDetailsDialogState();
  }
}

class _PersonDetailsDialogState extends State<PersonDetailsDialog> {
  @override
  Widget build(BuildContext context) {
    return AlertDialog(
      title: Text('Rewind and remember'),
      content: SingleChildScrollView(
        child: ListBody(
          children: <Widget>[
            Text('You will never be satisfied.'),
            Text('You\’re like me. I’m never satisfied.'),
          ],
        ),
      ),
      actions: <Widget>[
        FlatButton(
          child: Text('Regret'),
          onPressed: () {
            Navigator.of(context).pop();
          },
        ),
      ],
    );
  }
}

Upvotes: 6

Related Questions