#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. Государство» с тем же названием.