я не могу импортировать initState

#dart #flutter

#дротик #трепетание #dart #флаттер

Вопрос:

каждый раз, когда я импортирую initState внутри класса состояния, появляется эта ошибка

Класс ‘IntroViewState’ не может определять метод ‘State’ и иметь поле ‘initState.Государство» с тем же названием.

это код, который я использовал для вызова initState

 import 'package:flutter/material.dart';
import 'package:idb/pages/adminpage.dart';
import 'package:idb/pages/homepage.dart';
import 'package:intro_views_flutter/Models/page_view_model.dart';
import 'package:intro_views_flutter/intro_views_flutter.dart';
import 'package:shared_preferences/shared_preferences.dart';

class IntroView extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return IntroViewState();
  }
}

class IntroViewState extends State<IntroView> {
  BuildContext context;

  Future checkFirstSeen() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    bool _seen = (prefs.getBool('seen') ?? true);

    setState(() {
      if (_seen) {
        Navigator.of(context).pushReplacement(
            new MaterialPageRoute(builder: (context) => new AdminPage()));
      } else {
        prefs.setBool('seen', true);

        Navigator.of(context).pushReplacement(
            new MaterialPageRoute(builder: (context) => new IntroView()));
      }
    });
  }

  final pages = [
    PageViewModel(
        pageColor: Colors.white,
        bubble: Image.asset('assets/t.jpg'),
        body: Text('with the app you can check the card validation'),
        title: Text('Card Validation'),
        textStyle: TextStyle(
          color: Colors.tealAccent,
        ),
        mainImage: Image.asset(
          'assets/check.jpg',
          height: 500.0,
          width: 500.0,
          alignment: Alignment.center,
        )),

  ];

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(
        primaryColor: Colors.orange,
        primarySwatch: Colors.orange,
        accentColor: Colors.orangeAccent,
      ),
      debugShowCheckedModeBanner: false,
      home: Builder(
        builder: (context) => IntroViewsFlutter(
              pages,
              onTapDoneButton: () {
                Navigator.pushReplacement(
                  context,
                  MaterialPageRoute(
                      builder: (BuildContext context) => AdminPage()),
                );
              },
              onTapSkipButton: () {
                Navigator.pushReplacement(
                  context,
                  MaterialPageRoute(
                      builder: (BuildContext context) => AdminPage()),
                );
              },
              pageButtonTextStyles:
                  TextStyle(color: Colors.black, fontSize: 18.0),
            ),
      ),
    );
  }

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

почему? как я могу это решить?
и появляется другая ошибка, которая заключается в том, что

NoSuchMethodError: метод ‘ancestorStateOfType’ был вызван для null. E / flutter (28147): Приемник: null E / flutter (28147): Пытался вызвать: ancestorStateOfType(экземпляр ‘TypeMatcher’) E / flutter (28147): #0
Object.noSuchMethod (dart:core/runtime/libobject_patch.dart:50:5) E / flutter (28147): #1 Navigator.of (пакет: flutter/src/widgets/navigator.dart:1288:19) E / flutter (28147): #2 IntroViewState.checkFirstSeen. (пакет: idb/pages/introview.dart:31:15)

Комментарии:

1. Можете ли вы опубликовать код класса, в котором вы это используете?

2. я обновил свой вопрос

Ответ №1:

удаление context , я думаю, создает нулевую проблему

 class IntroViewState extends State<IntroView> {


  Future checkFirstSeen() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    bool _seen = (prefs.getBool('seen') ?? true);


      if (_seen) {
        Navigator.of(context).pushReplacement(
            new MaterialPageRoute(builder: (context) => new AdminPage()));
      } else {
        prefs.setBool('seen', true);

        Navigator.of(context).pushReplacement(
            new MaterialPageRoute(builder: (context) => new IntroView()));
      }

  }

  final pages = [
    PageViewModel(
        pageColor: Colors.white,
        bubble: Image.asset('assets/t.jpg'),
        body: Text('with the app you can check the card validation'),
        title: Text('Card Validation'),
        textStyle: TextStyle(
          color: Colors.tealAccent,
        ),
        mainImage: Image.asset(
          'assets/check.jpg',
          height: 500.0,
          width: 500.0,
          alignment: Alignment.center,
        )),

  ];

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(
        primaryColor: Colors.orange,
        primarySwatch: Colors.orange,
        accentColor: Colors.orangeAccent,
      ),
      debugShowCheckedModeBanner: false,
      home: Builder(
        builder: (context) => IntroViewsFlutter(
              pages,
              onTapDoneButton: () {
                Navigator.pushReplacement(
                  context,
                  MaterialPageRoute(
                      builder: (BuildContext context) => AdminPage()),
                );
              },
              onTapSkipButton: () {
                Navigator.pushReplacement(
                  context,
                  MaterialPageRoute(
                      builder: (BuildContext context) => AdminPage()),
                );
              },
              pageButtonTextStyles:
                  TextStyle(color: Colors.black, fontSize: 18.0),
            ),
      ),
    );
  }

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

Ответ №2:

Вот рабочий код, вы допустили много ошибок, я его изменил. Не стесняйтесь изменять его в соответствии с вашими потребностями.

 void main() => runApp(MaterialApp(home: IntroView(),));

class IntroView extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return IntroViewState();
  }
}

class IntroViewState extends State<IntroView> {
  @override
  void initState() {
    super.initState();
    Timer.run(() => checkFirstSeen());
  }

  Future checkFirstSeen() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    bool _seen = (prefs.getBool('seen') ?? true);

    if (_seen)
      _navigateToAdminPage();
    else
      prefs.setBool('seen', true);
  }

  void _navigateToAdminPage() {
    Navigator.of(context).push(MaterialPageRoute(builder: (context) => AdminPage()));
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("App"),),
      body: Column(
        children: <Widget>[
          RaisedButton(
            child: Text("Done"),
            onPressed: _navigateToAdminPage,
          ),
          RaisedButton(
            child: Text("Skip"),
            onPressed: _navigateToAdminPage,
          ),
        ],
      ),
    );
  }
}

class AdminPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("Admin Page")),
      body: Center(child: Text("This is admin page"),),
    );
  }
}
  

Комментарии:

1. Я обновил код, теперь он работает, можете ли вы попробовать?

2. та же ошибка появляется с классом initState ‘IntroViewState’, который не может определить метод ‘State’ и иметь поле ‘initState. Государство» с тем же названием.