【问题标题】:Not a subtype of type 'String?' issue不是“字符串”类型的子类型?问题
【发布时间】:2021-12-30 13:50:06
【问题描述】:

基本上,我有一个mainscreen 和一个HomeTabPage。我想将主屏幕键与主页绑定,以便在选项卡之间导航时可以保存页面的状态

这是我目前的代码

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider(
      create: (context) => AppData(),
      child: MaterialApp(
          title: 'Test',
          theme: ThemeData(
            //  fontFamily: "Brand Bold",
            primarySwatch: Colors.blue,
            visualDensity: VisualDensity.adaptivePlatformDensity,
          ),
          initialRoute: FirebaseAuth.instance.currentUser == null
              ? LoginScreen.idScreen
              : MainScreen(
                  map: HomeTabPage(),
                ),
          ),
    );
  }
}

mainScreen 有一个标签控制器

class MainScreen extends StatefulWidget {
  //const MainScreen({ Key? key }) : super(key: key);
  static const String idScreen = "mainScreen";
  final Widget map;

  const MainScreen({Key key, this.map}) : super(key: key);

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

class _MainScreenState extends State<MainScreen>
    with SingleTickerProviderStateMixin {
  TabController tabController;
  int selectedIndex = 0;
  void onItemClicked(int index) {
    setState(() {
      selectedIndex = index;
      tabController.index = selectedIndex;
    });
  }

  @override
  void initState() {
    super.initState();
    tabController = TabController(length: 4, vsync: this);
  }

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: TabBarView(
        physics: NeverScrollableScrollPhysics(),
        controller: tabController,
        children: [
          widget.map,
          //HomeTabPage(),
          EarningTabPage(),
          RatingTabPage(),
          ProfileTabPage(),
        ],
      ),
      bottomNavigationBar: BottomNavigationBar(
        items: [
          BottomNavigationBarItem(icon: Icon(Icons.home), label: "Home"),
          BottomNavigationBarItem(
              icon: Icon(Icons.credit_card), label: "Earnings"),
          BottomNavigationBarItem(icon: Icon(Icons.star), label: "Ratings"),
          BottomNavigationBarItem(icon: Icon(Icons.person), label: "Account"),
        ],
        unselectedItemColor: Colors.black54,
        selectedItemColor: Colors.yellow,
        type: BottomNavigationBarType.fixed,
        selectedLabelStyle: TextStyle(fontSize: 12.0),
        showUnselectedLabels: true,
        currentIndex: selectedIndex,
        onTap: onItemClicked,
      ),
    );
  }
}

HomeTabPage

class HomeTabPage extends StatefulWidget {
  const HomeTabPage({Key key}) : super(key: key);

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

class _HomeTabPageState extends State<HomeTabPage>
    with AutomaticKeepAliveClientMixin {
  @override
  bool get wantKeepAlive => true;

  @override
  void initState() {
    super.initState();

    
  }


 
  @override
  Widget build(BuildContext context) {
    super.build(context);
    return Stack(children: [
       ]);
  }
}

上面的代码给了我这个错误

type 'MainScreen' is not a subtype of type 'String?'

当我将 main.dart 文件更改为此时,它工作正常。

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

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        title: 'Test',
        theme: ThemeData(
          primarySwatch: Colors.blue,
        ),
        home: MainScreen(map: HomeTabPage())
  }
}

但我需要将它与 firebaseAuth 一起使用,我该怎么做?

【问题讨论】:

  • initialRoute: ....?MainScreen.idScreen
  • 不!不起作用。你能把完整的代码贴出来吗?
  • 您在构建后或在更改MainScreen.idScreen987654332@后构建时遇到问题
  • 在构建时,因为已经有一个 if else 检查,` initialRoute: FirebaseAuth.instance.currentUser == null ?登录屏幕.idScreen:? MainScreen.idScreen(map: HomeTabPage(), ),
  • 代码给出错误,MainScreen.idScreen 下的红色波浪线,工具提示错误说,` The expression doesn't evaluate to a function, so can't be invoked.

标签: firebase flutter dart firebase-authentication


【解决方案1】:

initialRoute 需要字符串。

 initialRoute: FirebaseAuth.instance.currentUser == null
              ? LoginScreen.idScreen
              : MainScreen.idScreen,
          ),

map 将获得默认值

Widget? map; // or just Widget map
const MainScreen({Key? key, this.map =const  HomeTabPage()}) : super(key: key);

更多关于initialRoute

【讨论】:

    猜你喜欢
    • 2020-02-23
    • 1970-01-01
    • 1970-01-01
    • 2020-01-08
    • 1970-01-01
    • 2021-11-26
    • 2018-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多