简体   繁体   English

Flutter,如何将值从一个 function 传递到另一页上的另一个 function

[英]Flutter, How to pass value from one function to another function on a different page

I a trying to pass a Value from when a button is clicked, What I want in the code is to pass the value from the Button Widget to another Page's Variable named pdfNo.我试图从单击按钮时传递一个值,我想要在代码中将值从按钮小部件传递到另一个名为 pdfNo 的页面变量。 Here's my code:这是我的代码:

FlatButton(
          padding: EdgeInsets.fromLTRB(2, 5, 5, 5),
          child: ListTile(
            leading: Icon(Icons.book, color: Color(0xFFEB3549)),
            title: Text('Book5'),
          ),
          onPressed: () {
            Navigator.push(
                context,
                MaterialPageRoute(
                builder: (context) => PDFPage() ));
            print('Pressed 6');
          },
        ),`

This is the Button on the First Page, On Pressed I would like to pass a Value to a function which is child, so I have created a variable, but cant figure out how to go about this next:这是第一页上的按钮,按下时我想将值传递给 function 这是孩子,所以我创建了一个变量,但无法弄清楚如何 go 下一个:

var pdfNo = 2;
bool _isLoading = true;
PDFDocument document;
@override
   void initState() {
      super.initState();
        changePDF(pdfNo);
        loadDocument();
         }

changePDF(value) async {
setState(() => _isLoading = true);
if (value == 1) {
  document = await PDFDocument.fromAsset('assets/sample2.pdf');
} else if (value == 2) {
  document = await PDFDocument.fromURL(
      "http://conorlastowka.com/book/CitationNeededBook-Sample.pdf");
} else {
  document = await PDFDocument.fromAsset('assets/sample.pdf');
}
setState(() => _isLoading = false);
}

So, I would like to pass a int from the button on page 1 Staleful Class to a Stateful Class on second page to changePDF(here).因此,我想将第 1 页 Staleful Class 上的按钮的 int 传递给第二页上的 Stateful Class 以更改PDF(此处)。

Please help me out.请帮帮我。 PS New to Flutter,Dart PS 新到 Flutter,Dart

You can create a to arguments...您可以创建一个to arguments...

Something like this像这样的东西

class LoginWidgetArguments {
  final String username;

  LoginWidgetArguments(
      {this.username});
}
class LoginWidget extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => _LoginWidgetState();
}

class _LoginWidgetState extends State<LoginWidget>{
  LoginWidgetArguments args;

  @override
  void initState() {
    //Get context
    // I do this because sometimes it doesn't get the context without the FutureDelay... This workaround I used with the first flutter versions, maybe now its not needed
    Future.delayed(Duration.zero, () {
      args = ModalRoute.of(context).settings.arguments;
      if (args != null) {
        print(args.username)
      }
    });
  }

....
}

And to navigate并导航

Navigator.pushNamed(context, LoginPage.routeName,
                    arguments: LoginWidgetArguments(
                        user: "user@yay.com");

Edit编辑

Maybe it could be simple...也许它可以很简单...

FlatButton(
          padding: EdgeInsets.fromLTRB(2, 5, 5, 5),
          child: ListTile(
            leading: Icon(Icons.book, color: Color(0xFFEB3549)),
            title: Text('Book5'),
          ),
          onPressed: () {
            Navigator.push(
                context,
                MaterialPageRoute(
                builder: (context) => PDFPage(pageNumber: 6) ));
            print('Pressed 6');
          },
        )
class PDFPage extends StatefulWidget {
  final int pageNumber;
  PDFPage({this.pageNumber});
  @override
  _PDFPageStage createState() => _PDFPageStage();
}

class _PDFPageStage extends State<PDFPage> {
...
    @override
   void initState() {
      super.initState();
      changePDF(widget.pageNumber);
      loadDocument();
   }
...
}

I'm not sure if I understand the problem correctly, but I think you can pass the number to the constructor of the StatefulWidget .我不确定我是否正确理解了这个问题,但我认为你可以将数字传递给StatefulWidget的构造函数。 I changed the PDFDocument to a String for simplicity.为了简单起见,我将PDFDocument更改为String

Some button press on first page:在第一页按下一些按钮:

onPressed: () {
  Navigator.push(
    context,
    MaterialPageRoute(
      builder: (context) => PDFPage(pdfNo: 4),
    ),
  );
},

The second page:第二页:

class PDFPage extends StatefulWidget {
  final int pdfNo;

  const PDFPage({Key key, this.pdfNo}) : super(key: key);
  @override
  _PDFPageState createState() => _PDFPageState();
}

class _PDFPageState extends State<PDFPage> {
  bool _isLoading = false;
  String _document;

void changePDF(int value) async {
  setState(() => _isLoading = true);
  if (value == 1) {
    _document = await Future.delayed(Duration(seconds: 1), () => 'Value 1');
  } else if (value == 2) {
    _document = await Future.delayed(Duration(seconds: 1), () => 'Value 2');
  } else {
    _document = await Future.delayed(Duration(seconds: 1), () => 'Other value');
  }
  setState(() => _isLoading = false);
}

  @override
  void initState() {
    super.initState();
    changePDF(widget.pdfNo);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Test'),),
          body: Center(
       child: _isLoading ? CircularProgressIndicator() : Text(_document ?? '(null)'), 
      ),
    );
  }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM