我试图在两页之间导航 . 在第二页中我需要一个构造函数,所以我需要在第一页中声明变量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 回答
您可以通过在传递时明确声明
List
上的类型来解决您的问题 .PostDetailsPage.tag: (context) => PostDetailsPage(List<charts.Series<dynamic, String>>()),
或者,您可以在页面本身上显式声明列表本身的类型:
final List<charts.Series<dynamic, String>> seriesList;
我认为图表库工作的预期方式是传入已经初始化的图表数据列表,然后页面呈现 . 如果您只想使用给定的示例数据返回,则应该使用给定的工厂方法
PostDetailsPage.withSampleData()
.