Flutter: Нет SuchMethodError, когда я вызвал Stateful Widget - PullRequest
1 голос
/ 18 марта 2020

Я новичок, чтобы трепетать. Я хочу сделать приложение, которое показывает страницу, выбранную BottomNavigationBar. Но когда я пытаюсь запустить приложение, оно выдает исключение. Ниже приведен журнал ошибок.

════════ Exception caught by widgets library

The following NoSuchMethodError was thrown building Builder:

The method '_debugTypesAreRight' was called on null.

Receiver: null
Tried calling: _debugTypesAreRight(Instance of 'MainPages')

The relevant error-causing widget was: 
  MaterialApp file:///C:/Users/jango/AndroidStudioProjects/study_and_statistic/lib/main.dart:49:14
When the exception was thrown, this was the stack:  
0 Object.noSuchMethod (dart:core-patch/object_patch.dart:53:5)  
1      new StatefulElement.<anonymous closure> (package:flutter/src/widgets/framework.dart:4309:19)  
2      new StatefulElement (package:flutter/src/widgets/framework.dart:4320:6)  
3      StatefulWidget.createElement (package:flutter/src/widgets/framework.dart:809:38)  
4      Element.inflateWidget (package:flutter/src/widgets/framework.dart:3189:40)

и мой код здесь

main.dart

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';

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

class AppConfig {
  static double width;
  static double height;
  static double blockSize;
  static double blockSizeVertical;
  static double statusBarHeight;

  static double getAppbarHeight(){
    double ratioHeight = blockSizeVertical*9;
    return (ratioHeight>60)? 60 : ratioHeight;
  }

  static double getGap(){
    double ratioGap = width/20;
    return (ratioGap>30)? 30 : ratioGap;
  }

  static double getFontsize_content(){
    double ratioSize = (blockSize>blockSizeVertical)?blockSizeVertical*6:blockSize*6;
    return (ratioSize > 18)? 18: ratioSize;
  }

  static double getFontsize_appBar(){
    double ratioSize = (blockSize>blockSizeVertical)?blockSizeVertical*7:blockSize*7;
    return (ratioSize > 20)? 20: ratioSize;
  }
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: (){
        FocusScope.of(context).unfocus();
      },
      child: MaterialApp(
        title: 'STUDY',
        theme: ThemeData(
          fontFamily: 'NanumBarunGothic',
          primaryColor: Color(0XFF5dc19b),
        ),
        home: MainPages()  //Here is the problem, maybe.. 
      )
    );
  }
}

PreferredSize DailyAppBar(){
  //My customAppBar
  //AppConfig used here
}

class SubjectListTile extends StatelessWidget{

  //My custom ListTile
  //AppConfig used here
}

class SubjectList extends StatefulWidget{
  @override
  State createState() =>   SubjectListState();
}

class SubjectListState extends State<SubjectList>{
  //My custom Listview
}

class MainPages extends StatefulWidget{
  const MainPages({ Key key }) : super(key: key);
  @override
  _MainPagesState createState() {
    _MainPagesState();
  }
}

class _MainPagesState extends State<MainPages>{

  int _currentIndex = 0;

  final List<Widget> pages = [
    SubjectList(),
    StudyPage(),
    StaticPage(),
  ];

  void init_AppConfig(BuildContext context){
    AppConfig.width = MediaQuery.of(context).size.width;
    AppConfig.height = MediaQuery.of(context).size.height;
    AppConfig.blockSize = AppConfig.width / 100;
    AppConfig.blockSizeVertical = AppConfig.height / 100;
    AppConfig.statusBarHeight = MediaQuery.of(context).padding.top;
    double width = AppConfig.width;
    double height = AppConfig.height;

    print('width: $width');
    print('height: $height');
  }

  void _onItemTapped(int index){
    setState((){
      _currentIndex = index;
    });
  }

  @override
  Widget build(BuildContext context) {
    init_AppConfig(context);
    return Scaffold(
      appBar: DailyAppBar(),
      body : pages[_currentIndex],
      bottomNavigationBar: BottomNavigationBar(
        currentIndex: _currentIndex,
        onTap: _onItemTapped,
        items: <BottomNavigationBarItem>[
          BottomNavigationBarItem(
            icon: Icon(Icons.check_box),
            title: Text('오늘의 공부'),
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.chrome_reader_mode),
            title: Text('집중모드'),
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.show_chart),
            title: Text('기록'),
          ),
        ],
      ),
    );
  }
}

class StaticPage extends StatelessWidget{ //Not impleted yet
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(child:Text("StaticPage")),
    );
  }
}
class StudyPage extends StatelessWidget{ //Not impleted yet
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(child:Text("StudyPage")),
    );
  }
}

В MyApp, MainPages () называется домом MaterialApp. В это время он генерирует исключение.
В классе MainPagesState функция build () сначала инициализирует Конфигурацию приложения.
А затем она создает виджет Scaffold, который включает DailyAppBar (моя пользовательская панель приложений), страницы [_currentIndex], bottomNavigationBar , Ежедневно AppBar и страницы [0] используют данные AppConfig.

Есть ли ошибка при использовании init_appConfig или bottomNavigationBar?
Appconfig, SubjectListTile, SubjectList и State, DailyAppBar работали хорошо, когда я помещал SubjectList () в тело Scaffold напрямую.

1 Ответ

1 голос
/ 18 марта 2020

Вы пропустили оператор возврата.

 @override
  _MainPagesState createState() {
    return _MainPagesState();
  }

или просто используете функцию стрелки

@override
  _MainPagesState createState() => _MainPagesState();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...