dart - 如何在每个特定页面上添加文本?

我编写了一些代码,每次按下添加按钮时都会打开一个新容器。这些容器中的每一个都会打开 RPage(如果您不理解,请检查代码)。

代码:

import 'package:flutter/material.dart';

import 'dart:io';

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

class MainPage extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    return MaterialApp ( 
      debugShowCheckedModeBanner: false,
      home:Scaffold (
        backgroundColor: Colors.white,
        body: Column (
          children: <Widget> [
            Container (
              height: 100.0
            ),
            Body(),
          ]
        )
      )
    );
  }

}

class Body extends StatefulWidget {

  @override
  _BodyState createState() => _BodyState();

}

class _BodyState extends State<Body> {

  final String open1 = 'open';

  int count = 1;

  @override
  Widget build(BuildContext context) {
    return Expanded (
      child: Container (
        child: NotificationListener<OverscrollIndicatorNotification> (
          onNotification: (OverscrollIndicatorNotification overscroll) {
            overscroll.disallowGlow();
          },
          child: PageView.builder(
            reverse: true,
            pageSnapping: false,
            controller: PageController(viewportFraction: 0.85),
            itemCount: count,
            itemBuilder: (context, i) {
              if (i == 0) {
                return GestureDetector (
                  onTap: () {
                    Navigator.push(
                      context,
                      MaterialPageRoute (
                        builder: (context) => RPage (
                          open: open1,
                        )
                      ),
                    );
                    count++;
                  },
                  child: Hero (
                    tag: open1,
                    child: Padding (
                      padding: EdgeInsets.only(
                        left: MediaQuery.of(context).size.height * 0.015,
                        right: MediaQuery.of(context).size.height * 0.015,
                        top: MediaQuery.of(context).size.width * 0.08,
                        bottom: MediaQuery.of(context).size.width * 0.15
                      ),
                      child: Material (
                        borderRadius: BorderRadius.circular(40.0),
                        color: Colors.white,
                        elevation: 8.0,
                        child: InkWell (
                          child: Column (
                            mainAxisAlignment: MainAxisAlignment.center,
                            children: <Widget> [
                              Icon (
                                Icons.add,
                                size: 30.0,
                                color: Colors.black,
                              )
                            ]
                          ),
                        )                        
                      )
                    )
                  )
                );
              } 
              else {
                return RCard(i);
              }
            }
          )
        )
      )
    );
  }

}

class RCard extends StatefulWidget {

  final int count;

  RCard(this.count);

  @override
  RCardState createState() => RCardState();

}

class RCardState extends State<RCard> {

  int count;

  String open2;

  @override
  void initState() {

    super.initState();

    count = widget.count;

    open2 = 'open$count';

  }

  @override
  Widget build(BuildContext context) {
    return Hero (
      tag: open2,
      child: GestureDetector (
        onTap: () {
          Navigator.push(
            context,
            MaterialPageRoute (
              builder: (context) => RPage (
                open: open2,
              )
            ),
          );
        },
        child: Padding (
          padding: EdgeInsets.only(
            left: MediaQuery.of(context).size.height * 0.015,
            right: MediaQuery.of(context).size.height * 0.015,
            top: MediaQuery.of(context).size.width * 0.08,
            bottom: MediaQuery.of(context).size.width * 0.15
          ),
          child: Material (
            borderRadius: BorderRadius.circular(40.0),
            color: Colors.white,
            elevation: 8.0,
          )
        )
      ),
    );
  }

}

class RPage extends StatelessWidget {

  final String open;

  RPage({this.open});

  @override
  Widget build(BuildContext context) {
    return GestureDetector (
      child: Hero (
        tag: open,
        child: Material (
          child: Container (
            color: Colors.white,
            child: Center (
              child: RBody()
            )
          )
        )
      ),
      onTap: () {
        Navigator.pop(context);
      },
    );
  }
}

class Constants {

 static const String add = 'Add';

 static const List<String> choices = <String>[

   add

 ];

}

class RBody extends StatefulWidget {

  @override
  RBodyState createState() => RBodyState();

}

class RBodyState extends State<RBody> {

  final String open1 = 'open';

  static bool platform;

  static int count = 1;

  @override
  Widget build(BuildContext context) {

    if (Platform.isIOS) {
      platform = true;
    }

    if (Platform.isAndroid) {
      platform = false;
    }

    return Column (
      children: <Widget> [
        Container (
          height: MediaQuery.of(context).size.height * 0.15,
          width: MediaQuery.of(context).size.width * 1.0,
          child: Row (
            children: <Widget> [
              Expanded (
                child: Container (
                  alignment: Alignment(-0.9, 1.0),
                  child: IconButton (
                    iconSize: 15.0,
                    icon: Icon (Icons.arrow_back_ios),
                    onPressed: () {
                      Navigator.pop(context);
                    },
                  )
                ),
              ),
              Expanded (
                child: Container (
                  alignment: Alignment(0.9, 1.0),
                  child: platform ? RotatedBox (
                    quarterTurns: 1,
                    child: PopupMenuButton<String> (
                      onSelected: (_) {   
                        setState(() {
                          count ++;
                        });
                      },
                      itemBuilder: (BuildContext context) {
                        return Constants.choices.map(
                          (String choice) {
                            return PopupMenuItem<String> (
                              value: choice,
                              child: Text(choice)
                            );
                          }
                        ).toList();
                      },
                    )
                  ) :
                  PopupMenuButton<String> (
                    onSelected: (_) {
                      setState(() {
                        count ++;
                      });
                    },
                    itemBuilder: (BuildContext context) {
                      return Constants.choices.map(
                        (String choice) {
                          return PopupMenuItem<String> (
                            value: choice,
                            child: Text(choice)
                          );
                        }
                      ).toList();
                    },
                  )
                )
              )
            ]
          ),
        ),
        Title(),
        Padding (
             padding: EdgeInsets.symmetric(
               vertical: platform ? 10.0 : 30.0
             ),
           ),
        Expanded (
          child: Align (
            alignment: Alignment.topCenter,
            child: Container (
              height: MediaQuery.of(context).size.height * 0.34,
              width: MediaQuery.of(context).size.height * 1.0,
              child: RList()
            )
          )
        )
      ]
    );
  }

}

class RList extends StatefulWidget {

  @override
  RListState createState() => RListState();

}

class RListState extends State<RList> {

  @override
  Widget build(BuildContext context) {

    return NotificationListener<OverscrollIndicatorNotification> (
      onNotification: (OverscrollIndicatorNotification overscroll) {
        overscroll.disallowGlow();
      },
      child: ListView.builder(
        controller: PageController(viewportFraction: 0.85),
        itemCount: RBodyState.count,
        itemBuilder: (context, i) {
          if (i == 0) {

            return Container();

          } else {

            return Cell(i);

          }
        }
      )
    );
  }

}

class Title extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    return Container (
      color: Colors.white,
      height: MediaQuery.of(context).size.height * 0.2,
      width: MediaQuery.of(context).size.width * 1.0,
      child: Align (
        alignment: Alignment.bottomCenter,
        child: Material (
          color: Colors.white,
          child: Text (
            'T I T L E',
            style: TextStyle (
              fontWeight: FontWeight.bold,
              fontSize: 20.0,
            ),
          )
        )
      )    
    );
  }

}

class Cell extends StatefulWidget {

  final int count;

  Cell(this.count);

  @override
  CellState createState() => CellState();

}

class CellState extends State<Cell> {

  @override
  Widget build(BuildContext context) {
    return Column (
      children: <Widget> [
        Material (
          color: Colors.white,
          child: Text (
            'T E X T',
            style: TextStyle (
              fontSize: 12.0,
              fontWeight: FontWeight.bold,
            ),
          )
        ),
        Padding (
          padding: EdgeInsets.symmetric(
            vertical: MediaQuery.of(context).size.height * 0.025
          ),
        ),
      ]  
    );  
  }

}

每次按下弹出菜单按钮时,RPage 都会创建新文本。但我期待只会在该特定页面上添加文本。 但是,我发现我的代码在每一页上都添加了文本。如何使文本仅添加到一个特定页面上?

最佳答案

好吧,如果你在 Flutter 中根本不了解 redux。一开始看起来有点太复杂了,但是如果你在看这个之前学习了 redux,那么你会发现在 redux 中管理状态太容易了,而不会让你的代码变得复杂。但是您必须制作更多文件才能使您的代码保持有序。我已经在 github 上上传了代码,这里给出的链接你可以克隆那个项目并自己尝试 Redux Card Example

https://stackoverflow.com/questions/55601769/

相关文章:

dart - 如何在 flutter 中实现字母滚动

android - 检索 ro.product.cpu.abi 的设备属性时出错 :

android - RenderCustomMultiChildLayoutBox 对象在布局期间被

android - flutter 等效于 `View::onAttachedToWindow` 和

android - 如何修复 webview_flutter 中的白屏?

dart - 蒙版/裁剪图像

flutter - 如何为 Playstore 上传制作多平台 flutter apk 版本或应用程

ios - 如何在flutter插件中导入外部iOS框架?

security - Flutter - 如何隐藏或更改小部件,如最近使用的应用程序概述中所示

firebase - 为什么我在 Firebase Cloud Functions 中收到 "Inv