首页 文章

在flutter中不能在两个页面之间传递null变量

提问于
浏览
0

我试图在两页之间导航 . 在第二页中我需要一个构造函数,所以我需要在第一页中声明变量null并在第二页中初始化它 .

在main.dart(第一页)我有类似的

PostDetailsPage.tag: (context) => PostDetailsPage(new List()),

在第二页(PostDetailsPage)我有这个

final List<charts.Series> seriesList;
final bool animate;

PostDetailsPage(this.seriesList, {this.animate});

当我去第二页返回

<List <Series <dynamic,dynamic >>>不是<List <Series <dynamic,String >>类型的子类型

那我怎么解决?初始化第一页中的值并传递它?在第一页中将值初始化为null并传递给它?

UPDATED

Main.dart类

import 'package:flutter/material.dart';
import 'package:fluttercrud/screens/login_page.dart';
import 'package:fluttercrud/screens/home_page.dart';
import 'package:fluttercrud/screens/partials/list_post.dart';
import 'package:fluttercrud/screens/maps_page.dart';
import 'package:fluttercrud/screens/post_details_page.dart';


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


class MyApp extends StatelessWidget {
  final routes = <String, WidgetBuilder>{
    LoginPage.tag: (context) => LoginPage(),
    HomePage.tag: (context) => HomePage(),
    ListPost.tag: (context) => ListPost(),
    MapsPage.tag: (context) => MapsPage(),
    PostDetailsPage.tag: (context) => PostDetailsPage(new List()),
  };

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'iGota',    
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        primarySwatch  : Colors.blue,
      ),
      home: LoginPage(),
      routes: routes,
    );
  }
}

PostDetailsPage.dart类

import 'package:flutter/material.dart';
import 'package:charts_flutter/flutter.dart'  as charts;


class PostDetailsPage extends StatelessWidget{
    static String tag = 'post-details-page';
  final List<charts.Series> seriesList;
  final bool animate;

  PostDetailsPage(this.seriesList, {this.animate});

  /// Creates a [BarChart] with sample data and no transition.
  factory PostDetailsPage.withSampleData() {
    return new PostDetailsPage(
      _createSampleData(),
      // Disable animations for image tests.
      animate: false,
    );
  }


  @override
  Widget build(BuildContext context) {
    return new charts.BarChart(
      seriesList,
      animate: animate,
    );
  }

  /// Create one series with sample hard coded data.
  static List<charts.Series<OrdinalSales, String>> _createSampleData() {
    final data = [
      new OrdinalSales('2014', 5),
      new OrdinalSales('2015', 25),
      new OrdinalSales('2016', 100),
      new OrdinalSales('2017', 75),
    ];

    return [
      new charts.Series<OrdinalSales, String>(
        id: 'Sales',
        colorFn: (_, __) => charts.MaterialPalette.blue.shadeDefault,
        domainFn: (OrdinalSales sales, _) => sales.year,
        measureFn: (OrdinalSales sales, _) => sales.sales,
        data: data,
      )
    ];
  }
}

/// Sample ordinal data type.
class OrdinalSales {
  final String year;
  final int sales;

  OrdinalSales(this.year, this.sales);
}

UPDATED 2: FIXED

Main.dart

import 'package:flutter/material.dart';
import 'package:fluttercrud/screens/login_page.dart';
import 'package:fluttercrud/screens/home_page.dart';
import 'package:fluttercrud/screens/partials/list_post.dart';
import 'package:fluttercrud/screens/maps_page.dart';
import 'package:fluttercrud/screens/post_details_page.dart';

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

class MyApp extends StatelessWidget {
  final routes = <String, WidgetBuilder>{
    LoginPage.tag: (context) => LoginPage(),
    HomePage.tag: (context) => HomePage(),
    ListPost.tag: (context) => ListPost(),
    MapsPage.tag: (context) => MapsPage(),
    PostDetailsPage.tag: (context) => PostDetailsPage(),
  };

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'iGota',    
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        primarySwatch  : Colors.blue,
      ),
      home: LoginPage(),
      routes: routes,
    );
  }
}

PostDetailsPage.dart

import 'package:flutter/material.dart';
import 'package:charts_flutter/flutter.dart' as charts;

class PostDetailsPage extends StatefulWidget {
  static String tag = 'post-details-page';

  @override
  PostDetailsPageState createState() => new PostDetailsPageState();
}

class PostDetailsPageState extends State<PostDetailsPage> {
  List<charts.Series> seriesList = [];
  bool animate;

  void initState() {
    super.initState();
    seriesList = _createSampleData();
    animate = false;
  }

  @override
  Widget build(BuildContext context) {
    return new Container(
      decoration: new BoxDecoration(color: Colors.white),
      child: new charts.BarChart(
        seriesList,
        animate: animate,
      ),
    );
  }

  /// Create one series with sample hard coded data.
  static List<charts.Series<OrdinalSales, String>> _createSampleData() {
    final data = [
      new OrdinalSales('2014', 5),
      new OrdinalSales('2015', 25),
      new OrdinalSales('2016', 100),
      new OrdinalSales('2017', 75),
    ];

    return [
      new charts.Series<OrdinalSales, String>(
        id: 'Sales',
        colorFn: (_, __) => charts.MaterialPalette.blue.shadeDefault,
        domainFn: (OrdinalSales sales, _) => sales.year,
        measureFn: (OrdinalSales sales, _) => sales.sales,
        data: data,
      )
    ];
  }
}

/// Sample ordinal data type.
class OrdinalSales {
  final String year;
  final int sales;

  OrdinalSales(this.year, this.sales);
}

1 回答

  • 0

    您可以通过在传递时明确声明 List 上的类型来解决您的问题 .

    PostDetailsPage.tag: (context) => PostDetailsPage(List<charts.Series<dynamic, String>>()),

    或者,您可以在页面本身上显式声明列表本身的类型:

    final List<charts.Series<dynamic, String>> seriesList;

    我认为图表库工作的预期方式是传入已经初始化的图表数据列表,然后页面呈现 . 如果您只想使用给定的示例数据返回,则应该使用给定的工厂方法 PostDetailsPage.withSampleData() .

相关问题