繁体   English   中英

Flutter,使用 Navigator 传递数据。 'Null' 类型不是 'String' 类型的子类型

[英]Flutter, passing data with Navigator. type 'Null' is not a subtype of type 'String'

对颤振非常陌生,不知道为什么会这样。

问题在于发送数据:

Navigator.push(
        context,
        MaterialPageRoute(
          builder: (context) => PressScreen(datas: dataSend),
        ));

以及获取数据的屏幕

  final List<Map<String, dynamic>> datas;
  PressScreen({Key? key, required this.datas}) : super(key: key);
  List<Widget> textWidgetList = [];


  @override
  Widget build(BuildContext context) {
    for (int i = 0; i < 8; i++) {
      textWidgetList.add(
        Container(
          child: Text(datas[i][0]),
        ),
      );
    }

完整代码和错误如下:

main.dart

import 'dart:collection';
import 'dart:math';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_app_homework/selection.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_database/firebase_database.dart';
import 'package:cloud_firestore/cloud_firestore.dart';

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  final Future<FirebaseApp> _fbApp = Firebase.initializeApp();
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        home: FutureBuilder(
      future: _fbApp,
      builder: (context, snapshot) {
        if (snapshot.hasError) {
          print('You Have ERRORS! ${snapshot.error.toString()}');
          return Text("Something Went wrong");
        } else if (snapshot.hasData) {
          print('ALL GOOD');
          return MyHomePage(
            title: 'home',
          );
        } else {
          return Center(
            child: CircularProgressIndicator(),
          );
        }
      },
    ));
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key, required this.title}) : super(key: key);
  final String title;
  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  FirebaseFirestore _firebase = FirebaseFirestore.instance;
  String classNumPressed = "";
  // DatabaseReference _testref = FirebaseDatabase.instance.reference().child('test');
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        backgroundColor: Colors.teal,
        appBar: AppBar(
          title: Text("Demo"),
          backgroundColor: Colors.blueGrey[900],
        ),
        body: SafeArea(
          child: Column(
            children: <Widget>[
              Card(
                margin: EdgeInsets.symmetric(vertical: 10, horizontal: 20),
                child: ElevatedButton(
                  style: ElevatedButton.styleFrom(
                    primary: Colors.white,
                  ),
                  onPressed: () {
                    print('class 1 is presseed');
                    classNumPressed = 'Class1';
                    print(classNumPressed);
                    getSeat();
                  },
                  child: ListTile(
                      leading: Icon(
                        Icons.photo_camera,
                        color: Colors.black,
                        size: 60,
                      ),
                      title: Text('Class 1',
                          style: TextStyle(
                            color: Colors.black,
                            fontSize: 50,
                          ))),
                ),
              ),
              Card(
                margin: EdgeInsets.symmetric(vertical: 10, horizontal: 20),
                child: ElevatedButton(
                  style: ElevatedButton.styleFrom(
                    primary: Colors.white,
                  ),
                  onPressed: () {
                    print('class 2 is presseed');
                    classNumPressed = 'Class2';
                    print(classNumPressed);
                    getSeat();
                  },
                  child: ListTile(
                      leading: Icon(
                        Icons.photo_camera,
                        color: Colors.red,
                        size: 60,
                      ),
                      title: Text('Class 2',
                          style: TextStyle(
                            color: Colors.black,
                            fontSize: 50,
                          ))),
                ),
              )
            ],
          ),
        ),
      ),
    );
  }

  Future<void> getSeat() async {
    print(classNumPressed);
    List<Map<String, dynamic>> dataToSend = [];

    QuerySnapshot seats = await _firebase.collection(classNumPressed).get();
    final List allData = seats.docs.map((doc) => doc.data()).toList();
    for (Map<String, dynamic> seat in allData) {
      print("------------for loop");
      print(seat);
      dataToSend.add(seat);
    }
    print("------for loop datato send is ");
    print(dataToSend);
    print(dataToSend.length);

    print("-------before transfer ");
    final List<Map<String, dynamic>> dataSend = dataToSend;
    Navigator.push(
        context,
        MaterialPageRoute(
          builder: (context) => PressScreen(datas: dataSend),
        ));
  }
}

class PressScreen extends StatelessWidget {
  final List<Map<String, dynamic>> datas;
  PressScreen({Key? key, required this.datas}) : super(key: key);
  List<Widget> textWidgetList = [];


  @override
  Widget build(BuildContext context) {
    for (int i = 0; i < 8; i++) {
      textWidgetList.add(
        Container(
          child: Text(datas[i][0]),
        ),
      );
    }

    return Scaffold(
        backgroundColor: Colors.teal,
        body: SafeArea(
            child: Center(
                child: Column(
          children: textWidgetList,
        ))));
  }
}

错误信息

======== Exception caught by widgets library =======================================================
The following _TypeError was thrown building PressScreen(dirty):
type 'Null' is not a subtype of type 'String'

The relevant error-causing widget was: 
  PressScreen file:///Users/j.zhao8/AndroidStudioProjects/Cmput301Project/flutter_app_homework/lib/main.dart:141:33
When the exception was thrown, this was the stack: 
#0      PressScreen.build (package:flutter_app_homework/main.dart:157:31)
#1      StatelessElement.build (package:flutter/src/widgets/framework.dart:4732:28)
#2      ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4658:15)
#3      Element.rebuild (package:flutter/src/widgets/framework.dart:4348:5)
#4      ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4636:5)
#5      ComponentElement.mount (package:flutter/src/widgets/framework.dart:4631:5)
...     Normal element mounting (169 frames)
#174    Element.inflateWidget (package:flutter/src/widgets/framework.dart:3666:14)
#175    MultiChildRenderObjectElement.inflateWidget (package:flutter/src/widgets/framework.dart:6324:36)
#176    Element.updateChild (package:flutter/src/widgets/framework.dart:3418:18)
#177    RenderObjectElement.updateChildren (package:flutter/src/widgets/framework.dart:5749:32)
#178    MultiChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6347:17)
#179    Element.updateChild (package:flutter/src/widgets/framework.dart:3405:15)
#180    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4683:16)
#181    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4831:11)
#182    Element.rebuild (package:flutter/src/widgets/framework.dart:4348:5)
#183    StatefulElement.update (package:flutter/src/widgets/framework.dart:4863:5)
#184    Element.updateChild (package:flutter/src/widgets/framework.dart:3405:15)
#185    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4683:16)
#186    Element.rebuild (package:flutter/src/widgets/framework.dart:4348:5)
#187    ProxyElement.update (package:flutter/src/widgets/framework.dart:5011:5)
#188    Element.updateChild (package:flutter/src/widgets/framework.dart:3405:15)
#189    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4683:16)
#190    Element.rebuild (package:flutter/src/widgets/framework.dart:4348:5)
#191    ProxyElement.update (package:flutter/src/widgets/framework.dart:5011:5)
#192    _InheritedNotifierElement.update (package:flutter/src/widgets/inherited_notifier.dart:181:11)
#193    Element.updateChild (package:flutter/src/widgets/framework.dart:3405:15)
#194    SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6193:14)
#195    Element.updateChild (package:flutter/src/widgets/framework.dart:3405:15)
#196    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4683:16)
#197    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4831:11)
#198    Element.rebuild (package:flutter/src/widgets/framework.dart:4348:5)
#199    StatefulElement.update (package:flutter/src/widgets/framework.dart:4863:5)
#200    Element.updateChild (package:flutter/src/widgets/framework.dart:3405:15)
#201    SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6193:14)
#202    Element.updateChild (package:flutter/src/widgets/framework.dart:3405:15)
#203    SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6193:14)
#204    Element.updateChild (package:flutter/src/widgets/framework.dart:3405:15)
#205    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4683:16)
#206    Element.rebuild (package:flutter/src/widgets/framework.dart:4348:5)
#207    ProxyElement.update (package:flutter/src/widgets/framework.dart:5011:5)
#208    Element.updateChild (package:flutter/src/widgets/framework.dart:3405:15)
#209    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4683:16)
#210    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4831:11)
#211    Element.rebuild (package:flutter/src/widgets/framework.dart:4348:5)
#212    BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2620:33)
#213    WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:878:21)
#214    RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:330:5)
#215    SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1143:15)
#216    SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1080:9)
#217    SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:996:5)
#221    _invoke (dart:ui/hooks.dart:163:10)
#222    PlatformDispatcher._drawFrame (dart:ui/platform_dispatcher.dart:259:5)
#223    _drawFrame (dart:ui/hooks.dart:126:31)
(elided 3 frames from dart:async)

根据错误,我相信dataSend 中没有数据,请在推送到新屏幕之前尝试打印dataSend响应。

print(dataSend);

Navigator.push(
  context,
  MaterialPageRoute(
    builder: (context) => PressScreen(datas: dataSend),
));

我太傻了! 错误出在child: Text(datas[i][0]),身上child: Text(datas[i][0]),

就像Fatima ayaa提到的那样,我解决了这个问题

Widget build(BuildContext context) {
    for (int i = 0; i < datas.length; i++) {
      var list = datas[i].values.toList();
      textWidgetList.add(
        Container(

          child: Text(list[0].toString()),
        ),
      );
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM