Flutter MaterialApp initRoute 设置为'/'无法渲染出页面?

设置MaterialApp initRoute为'/', 提示这个错误'Could not find a generator for route RouteSettings("/", null) in the _WidgetsAppState.'

main.dart

import 'package:flutter/material.dart';
import 'package:flutter_demo/pages/Tabs.dart';

import 'package:flutter_demo/routes/Routes.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      // home: TabPage(),
      // routes: {
      //   '/form': (context) => FormsPage(),
      //   '/search': (context) => SearchPage()
      // },
      initialRoute: '/',
      onGenerateRoute: onGenerateRoute,
      theme: ThemeData(primarySwatch: Colors.blue),
    );
  }
}

Route.dart

import 'package:flutter/material.dart';
import 'package:flutter_demo/pages/Tabs.dart';
import 'package:flutter_demo/pages/users/Login.dart';


final routes = {
  '/': (context) => TabPage(),
  '/login': (context) => LoginPage(),
};

var onGenerateRoute = (RouteSettings settings) {
  final String name = settings.name;
  final Function pageContentBuilder = routes[name];

  if (pageContentBuilder != null) {
    if (settings.arguments != null) {
      final Route route = MaterialPageRoute(
          builder: (context) =>
              pageContentBuilder(context, arguments: settings.arguments));
      return route;
    }
  } else {
    final Route route =
        MaterialPageRoute(builder: (context) => pageContentBuilder(context));
    return route;
  }
};

Tab.dart

import 'package:flutter/material.dart';
import 'package:flutter_demo/pages/tabs/Category.dart';
import 'package:flutter_demo/pages/tabs/Home.dart';
import 'package:flutter_demo/pages/tabs/Setting.dart';

class TabPage extends StatefulWidget {
  final index;
  TabPage({Key key, this.index = 0}) : super(key: key);

  @override
  _TabPageState createState() => _TabPageState(this.index);
}

class _TabPageState extends State<TabPage> {
  int _currIndex;

  _TabPageState(index) {
    this._currIndex = index;
  }

  List _pageList = [HomePage(), CategoryPage(), SettingPage()];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Demo'),
      ),
      body: this._pageList[this._currIndex],
      bottomNavigationBar: BottomNavigationBar(
        currentIndex: this._currIndex,
        onTap: (int index) {
          setState(() {
            this._currIndex = index;
          });
        },
        fixedColor: Colors.green,
        items: [
          BottomNavigationBarItem(
              icon: Icon(
                Icons.home,
              ),
              label: '首页'),
          BottomNavigationBarItem(
              icon: Icon(
                Icons.category,
              ),
              label: '分类'),
          BottomNavigationBarItem(
              icon: Icon(
                Icons.settings,
              ),
              label: '首设置页')
        ],
      ),
    );
  }
}

the Error:

════════ Exception caught by widgets library ═══════════════════════════════════
The following assertion was thrown building IconTheme(color: Color(0xdd000000)):
Could not find a generator for route RouteSettings("/", null) in the _WidgetsAppState.

Make sure your root app widget has provided a way to generate
this route.
Generators for routes are searched for in the following order:

  1. For the "/" route, the "home" property, if non-null, is used.
  2. Otherwise, the "routes" table is used, if it has an entry for the route.
  3. Otherwise, onGenerateRoute is called. It should return a non-null value for any valid route not handled by "home" and "routes".
  4. Finally if all else fails onUnknownRoute is called.

Unfortunately, onUnknownRoute was not set.
The relevant error-causing widget was

我将Navigator.pushNamed(context, '/login')改为

navigator.push(context, MaterialPageRoute(
  builder: (context) => LoginPage()
))

并且设置MaterialApp(home: TabPage())可以正常跳转.

所以为什么设置MaterialApp(initRoute: '/')并且用navigator.pushNamed()会得到上面的错误.

阅读 5.2k
1 个回答

onGeneratePageRoute()内部逻辑错误

var onGeneratePageRoute = (RouteSettings settings) {
  final String name = settings.name;
  final Function pageContentBuilder = routes[name];

  if (pageContentBuilder != null) {
    if (settings.arguments != null) {
      final Route route = MaterialPageRoute(
          builder: (context) =>
              pageContentBuilder(context, arguments: settings.arguments));
      return route;
    } else {
      final Route route =
          MaterialPageRoute(builder: (context) => pageContentBuilder(context));
      return route;
    }
  }
};
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题