具有抖动状态的问题

问题描述 投票:0回答:1

这是Flutter的实验。我试图在Flutter中创建一个段落生成器。制作了一个UI

enter image description here

List<String>加载数据。

data.dart

class MyData {
  static final List<String> data1 = [
    '0Title Of Page',
    '3Paragraph title One',
    '1First Paragraph Content Of Page',
    '3Paragraph title two',
    '1Second Paragraph Content Of Page',
    '4End of the page line',
  ];
}

我想将此列表中的第一项带到AppBar()的标题,并且它起作用了。然后,我想从此列表中删除第一个项目(用作AppBar标题),并继续使用列表中的其余项目以构建UI的body:

当我们第一次打开此页面时,此方法很好。从下一次开始,每次打开和关闭页面时,我们都会丢失列表中的第一项。即使页面是StatelessWidget,我们也会丢失项目,最后列出项目用尽。

我尝试过的事情:

  • 我尝试将页面和小部件更改为StatelessWidget
  • 尝试过override后退按钮和AppBar页面。
  • pop()复制到新变量。
  • 使用List<String>方法。

还是一样。可能是什么问题?在下面添加代码。

dispose()

main.dart

import 'package:flutter/material.dart'; import 'home_page.dart'; import 'page_one.dart'; import 'page_two.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Paragraph Test', initialRoute: '/', routes: { '/': (context) => HomePage(), '/pageone': (context) => PageOne(), '/pagetwo': (context) => PageTwo(), }, ); } }

home_page.dart

import 'package:flutter/material.dart'; import 'button.dart'; class HomePage extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Page Test'), ), body: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: <Widget>[ CButton( onTap: () { Navigator.pushNamed(context, '/pageone'); }, text: 'Page One', ), CButton( onTap: () { Navigator.pushNamed(context, '/pagetwo'); }, text: 'Page Two', ), ], ), ); } }

page_one.dart

import 'package:flutter/material.dart'; import 'data.dart'; var weight = FontWeight.normal; var align = TextAlign.center; var color = Colors.white60; var size = 16.0; String x, y; class PageOne extends StatelessWidget { buildText(String b) { x = b.substring(0, 1); y = b.substring(1); if (x.contains('0')) { weight = FontWeight.bold; color = Colors.blue; size = 18.0; align = TextAlign.center; } else if (x.contains('2')) { weight = FontWeight.normal; color = Colors.blue; align = TextAlign.right; size = 16.0; } else if (x.contains('3')) { weight = FontWeight.normal; color = Colors.blue; align = TextAlign.center; size = 16.0; } else if (x.contains('4')) { weight = FontWeight.normal; color = Colors.red; align = TextAlign.center; size = 16.0; } else { weight = FontWeight.normal; color = Colors.white60; align = TextAlign.center; size = 16.0; } return y; } @override Widget build(BuildContext context) { String title = MyData.data1.first.substring(1); MyData.data1.removeAt(0); return Scaffold( appBar: AppBar( centerTitle: true, title: Text('$title'), ), body: Container( decoration: BoxDecoration( color: Colors.blueGrey, ), child: Container( width: double.infinity, height: double.infinity, margin: EdgeInsets.all( 12.0, ), decoration: BoxDecoration( color: Color(0x99000000), borderRadius: BorderRadius.circular(10.0), ), child: SingleChildScrollView( padding: EdgeInsets.all(8.0), child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: MyData.data1 .map( (item) => Text( buildText(item), textAlign: align, style: TextStyle( color: color, fontWeight: weight, fontSize: size, ), ), ) .toList(), ), ), ), ), floatingActionButton: FloatingActionButton( child: Text('Page 1'), onPressed: () {}, ), ); } }

page_two.dart

import 'package:flutter/material.dart'; import 'data.dart'; var weight = FontWeight.normal; var align = TextAlign.center; var color = Colors.white60; var size = 16.0; String x, y; class PageTwo extends StatelessWidget { buildText(String b) { x = b.substring(0, 1); y = b.substring(1); if (x.contains('0')) { weight = FontWeight.bold; color = Colors.blue; size = 18.0; align = TextAlign.center; } else if (x.contains('2')) { weight = FontWeight.normal; color = Colors.blue; align = TextAlign.right; size = 16.0; } else if (x.contains('3')) { weight = FontWeight.normal; color = Colors.blue; align = TextAlign.center; size = 16.0; } else if (x.contains('4')) { weight = FontWeight.normal; color = Colors.red; align = TextAlign.center; size = 16.0; } else { weight = FontWeight.normal; color = Colors.white60; align = TextAlign.center; size = 16.0; } return y; } @override Widget build(BuildContext context) { String title = MyData.data1.first.substring(1); MyData.data1.removeAt(0); return Scaffold( appBar: AppBar( centerTitle: true, title: Text('$title'), ), body: Container( decoration: BoxDecoration( color: Colors.blueGrey, ), child: Container( width: double.infinity, height: double.infinity, margin: EdgeInsets.all( 12.0, ), decoration: BoxDecoration( color: Color(0x99000000), borderRadius: BorderRadius.circular(10.0), ), child: SingleChildScrollView( padding: EdgeInsets.all(8.0), child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: MyData.data1 .map( (item) => Text( buildText(item), textAlign: align, style: TextStyle( color: color, fontWeight: weight, fontSize: size, ), ), ) .toList(), ), ), ), ), floatingActionButton: FloatingActionButton( child: Text('Page 2'), onPressed: () {}, ), ); } }

button.dart
flutter flutter-layout flutter-state flutter-statelesswidget
1个回答
0
投票

import 'package:flutter/material.dart'; class CButton extends StatelessWidget { CButton({this.text, this.onTap}); final String text; final Function onTap; @override Widget build(BuildContext context) { return GestureDetector( onTap: onTap, child: Container( margin: EdgeInsets.all(2.0), padding: EdgeInsets.all(16.0), decoration: BoxDecoration(color: Colors.blue), child: Text( '$text', style: TextStyle(color: Colors.white), ), ), ); } } data1类中的static变量。因此,它是带有名称空间MyData的全局变量。因此,每次执行MyData都会影响相同的内存(或对象)。

针对您的情况,请尝试此,

MyData.data1.removeAt(0);
class MyData {
  static List<String> get data1 => [
    '0Title Of Page',
    '3Paragraph title One',
    '1First Paragraph Content Of Page',
    '3Paragraph title two',
    '1Second Paragraph Content Of Page',
    '4End of the page line',
  ];
}
© www.soinside.com 2019 - 2024. All rights reserved.