颤动关闭条件内的对话框

Raf*_*leo 3 dart flutter

我正在尝试动态关闭对话框。我真正想做的是根据我目前掌握的信息更改对话框的内容。

从加载信息开始,没有按钮,几秒钟后可能会出现错误,关闭对话框的确定​​按钮。

class Dialogs{
  loginLoading(BuildContext context, String type, String description){
    var descriptionBody;

    if(type == "error"){
      descriptionBody = CircleAvatar(
        radius: 100.0,
        maxRadius: 100.0,
        child: new Icon(Icons.warning),
        backgroundColor: Colors.redAccent,
      );
    } else {
      descriptionBody = new Center(
        child: new CircularProgressIndicator(),
      );
    }

    return showDialog(
      context: context,
      barrierDismissible: false,
      builder: (BuildContext context){
        return AlertDialog(
          title: descriptionBody,
          content: SingleChildScrollView(
            child: ListBody(
              children: <Widget>[
                Center(child: Text(description))
              ],
            ),
          ),
        );
      }
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

所以在创建实例os对话框并打开它之后

Dialogs _dialog = new Dialogs();
_dialog.loginLoading(context, "loading", "loading...");

// Close the dialog code here
don't know how to do it

// Call again the AlertDialog with different content.
Run Code Online (Sandbox Code Playgroud)

sre*_*amu 5

https://docs.flutter.io/flutter/material/showDialog.html

此方法创建的对话路由被推送到根导航器。如果应用程序有多个 Navigator 对象,则可能需要调用 Navigator.of(context, rootNavigator: true).pop(result) 来关闭对话框,而不仅仅是 Navigator.pop(context, result)。

因此,以下任何一项都适合您

  • Navigator.of(context, rootNavigator: true).pop(result)
  • Navigator.pop(上下文,结果)


Sou*_*tes 3

您不需要关闭并重新打开该对话框。相反,让 flutter 处理对话框更新。该框架正是为此而优化的。

这是一个可以作为起点的工作示例应用程序(只需添加您自己的 Dialogs 类):

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'MyApp',
      home: Login(
        child: Home(),
      ),
    );
  }
}

class Home extends StatefulWidget {
  final Dialogs dialog = Dialogs();
  @override
  State<StatefulWidget> createState() => HomeState();
}

class HomeState extends State<Home> {
  @override
  void didChangeDependencies() {
    super.didChangeDependencies();
    Future.delayed(Duration(milliseconds: 50)).then((_) {
      widget.dialog.loginLoading(
        context,
        LoginStateProvider.of(context).type,
        LoginStateProvider.of(context).description,
      );
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Updating Dialog'),
      ),
      body: Container(),
    );
  }
}

class Login extends StatefulWidget {
  final Widget child;
  Login({@required this.child});

  @override
  State<StatefulWidget> createState() => LoginState();
}

class LoginState extends State<Login> {
  String type = 'wait';
  String description = 'foo';

  @override
  void didChangeDependencies() {
    super.didChangeDependencies();
    Future.delayed(Duration(milliseconds: 2000)).then((_) {
      setState(() {
        type = 'error';
        description = 'bar';
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return LoginStateProvider(widget.child, type, description);
  }
}

class LoginStateProvider extends InheritedWidget {
  final String type;
  final String description;
  LoginStateProvider(Widget child, this.type, this.description)
      : super(child: child);
  @override
  bool updateShouldNotify(LoginStateProvider old) {
    return type != old.type || description != old.description;
  }

  static LoginStateProvider of(BuildContext context) =>
      context.inheritFromWidgetOfExactType(LoginStateProvider);
}
Run Code Online (Sandbox Code Playgroud)