非空实例字段['controller']必须在flutter中初始化

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

美好的一天! 我是 Flutter 的新手,想开始我的 Startup,但我陷入了这个问题,无法以 Tabbar 为例......

因为这个问题我几乎郁闷了一整天......

Dart Analysis 下面一直这么说....

不可为空的实例字段['controller']必须在flutter中初始化

提前非常感谢。

        import 'package:flutter/material.dart';
import 'sub/firstPage.dart';
import 'sub/secondPage.dart';


void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(

        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key? key, required this.title}) : super(key: key);



  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> with SingleTickerProviderStateMixin {

  TabController controller;

  @override
  void initState() {
    super.initState();
    controller = TabController(length: 2, vsync: this);


  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text('TabBar Example'),
        ),
        body: TabBarView(
          children: <Widget>[FirstApp(), SecondApp()],
          controller: controller,
        ),
        bottomNavigationBar: TabBar(tabs: [
          Tab(icon: Icon(Icons.looks_one, color: Colors.blue),),
          Tab(icon: Icon(Icons.looks_two, color: Colors.blue),),
        ],
        )
    );
  }

  @override
  void dispose() {
    controller.dispose();
    super.dispose();
  }


        }
flutter dart nullable dart-null-safety non-nullable
4个回答
1
投票

请尝试一下,您错过了使用控制器

import 'package:flutter/material.dart';
import 'sub/firstPage.dart';
import 'sub/secondPage.dart';


void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(

        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key? key, required this.title}) : super(key: key);



  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> with SingleTickerProviderStateMixin {

  late TabController controller;

  @override
  void initState() {
    super.initState();
    controller = TabController(length: 2, vsync: this);


  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text('TabBar Example'),
        ),
        body: TabBarView(
          children: <Widget>[FirstApp(), SecondApp()],
          controller: controller,
        ),
        bottomNavigationBar: TabBar(
          controller: controller, // add here 
          tabs: [
          Tab(icon: Icon(Icons.looks_one, color: Colors.blue),),
          Tab(icon: Icon(Icons.looks_two, color: Colors.blue),),
        ],
        )
    );
  }

  @override
  void dispose() {
    controller.dispose();
    super.dispose();
  }


}



1
投票

由于您的字段不允许空值,但您无法在创建字段时对其进行初始化,因此您必须将其声明为

late
:

late TabController controller;

这允许您稍后分配一个值,但是如果您在分配之前使用它,您将遇到异常。你的代码看起来应该没问题。


1
投票
看起来您在项目中使用了零安全性。所以 dart 正在抱怨这条线。 Dart 希望它在创建后立即初始化:

TabController controller;
要解决此问题,请在 TabController 之前添加“late”关键字:

late TabController controller;
    

0
投票
我也很惊讶这是非法的:

class Thing { final String stuff; const Thing(List<String> stuffs) { stuff = stuffs.join("\n"); } }
要修复它,您可以

    确保
  1. stuff
     是可变的(删除 
    final
    const
    )并添加 
    late
     - 但如果我理解正确的话,这会带来性能成本
  2. 像这样使用工厂构造函数:
class Thing { final String stuff; const Thing._(this.stuff); factory Thing(List<String> stuffs) { var stuff = stuffs.join("\n"); return Thing._(stuff); } }
    
© www.soinside.com 2019 - 2024. All rights reserved.