首页 > 解决方案 > 子部件发送动态数据

问题描述

我有一个两页的应用程序。在第一页上,我显示了一个每 1 秒更改一次的 UUID。它使用列表视图显示。一旦用户单击列表视图,它就会转到第二页并显示该卡上的数据。

它应该是不断变化的 UUID。但显示的数据是静态 UUID。如何将第 1 页更改的数据传递到第 2 页?

    import 'dart:async';
import 'package:uuid/uuid.dart';
import 'package:uuid/uuid_util.dart';

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

List<EuropeanCountries> europeanCountries = [];

class EuropeanCountries {
  String myText;

  String myUuid;

  EuropeanCountries({
    this.myText,
    this.myUuid,
  });
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;
  int _perPage = 50;
  ScrollController _myScrollController = ScrollController();

  void _incrementCounter() async {
    const ThreeSec = const Duration(seconds: 1);
    this._counter++;
    europeanCountries.insert(
        0,
        EuropeanCountries(
          myText: this._counter.toString(),
        ));
    print(europeanCountries[0].myText);

    setState(() {});
  }

  void getMoreData() {
    print('adding More Product ');

    europeanCountries.add(EuropeanCountries(
      myText: this._counter.toString(),
    ));
    //europeanCountries.insert(0, EuropeanCountries(myText:this._counter.toString(), myButtonText: "", myColor: Colors.blue));
    setState(() {});
  }

  void generateUUID() async {
    var uuid = Uuid();

    for (int i = 0; i < 6000; i++) {
      await new Future.delayed(new Duration(milliseconds: 1000));
      for (EuropeanCountries currCountry in europeanCountries) {
        currCountry.myUuid = uuid.v1();
      }
      setState(() {});
    }
  }

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    generateUUID();

    _myScrollController.addListener(() {
      double maxscroll = _myScrollController.position.maxScrollExtent;
      double currentScroll = _myScrollController.position.pixels;
      double delta = MediaQuery.of(context).size.height * 0.25;
      print("mac Scroll Controller - " + maxscroll.toString());
      print("Current  Scroll Controller - " + currentScroll.toString());
      print("delta  Scroll Controller - " + delta.toString());

      if ((maxscroll - currentScroll) < delta) {
        getMoreData();
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: _myListView(context),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ), // This trailing comma makes auto-formatting nicer for build methods.
    );
  }

  Widget _myListView(BuildContext context) {
    // backing data

    return Container(
      child: europeanCountries.length == 0
          ? Center(
              child: Text('No Product to Display'),
            )
          : ListView.builder(
              controller: _myScrollController,
              itemCount: europeanCountries.length,
              reverse: false,
              itemBuilder: (context, index) {
                return myContainer(index: index);
              },
            ),
    );
  }
}

class myContainer extends StatefulWidget {
  final int index;
  const myContainer({Key key, this.index}) : super(key: key);

  @override
  _myContainerState createState() => _myContainerState();
}

class _myContainerState extends State<myContainer> {
  @override
  Widget build(BuildContext context) {
    return Container(
      height: 120,
      decoration: BoxDecoration(
        border: Border.all(color: Colors.blue[700]),
        shape: BoxShape.rectangle,
        borderRadius: BorderRadius.all(Radius.circular(8)),
      ),
      margin: EdgeInsets.all(20),
      child: Column(
        children: <Widget>[
          Text(europeanCountries[widget.index].myText),
          SizedBox(
            height: 15,
          ),
          RaisedButton(
            child: Text('Detail'),
            onPressed: () {
              Navigator.push(
                context,
                MaterialPageRoute(
                    builder: (context) => SecondRoute(
                          myCountry: europeanCountries[widget.index],
                        )),
              );
            },
            color: Colors.blue[700],
            textColor: Colors.white,
            padding: EdgeInsets.fromLTRB(10, 10, 10, 10),
            splashColor: Colors.black,
          ),
          Text(europeanCountries[widget.index].myUuid != null
              ? europeanCountries[widget.index].myUuid
              : 'Default')
        ],
      ),
    );
  }
}

class SecondRoute extends StatefulWidget {
  final EuropeanCountries myCountry;

  const SecondRoute({Key key, this.myCountry}) : super(key: key);

  @override
  _SecondRouteState createState() => _SecondRouteState();
}

class _SecondRouteState extends State<SecondRoute> {
  @override
  void didUpdateWidget(SecondRoute oldWidget) {
    // TODO: implement didUpdateWidget
    super.didUpdateWidget(oldWidget);
    setState(() {});
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Second Route"),
      ),
      body: Center(
        child: RaisedButton(
          onPressed: () {
            Navigator.pop(context);
          },
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Center(
                child: Text(widget.myCountry.myUuid != null
                    ? widget.myCountry.myText
                    : 'default'),
              ),
              SizedBox(height: 15),
              Center(
                child: Text(widget.myCountry.myUuid != null
                    ? widget.myCountry.myUuid
                    : 'default'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

https://imgur.com/VqRfcZY

<blockquote class="imgur-embed-pub" lang="en" data-id="VqRfcZY"><a href="//imgur.com/VqRfcZY"></a></blockquote><script async src="//s.imgur.com/min/embed.js" charset="utf-8"></script>

标签: flutter

解决方案


推荐阅读