मेरे पास एक परिदृश्य है जिसमें मैं मूल्य के आधार पर SharePreferences के मूल्य की जांच करता हूं, यह उपयोगकर्ता को होमपेज या लैंडिंगपेज पर रीडायरेक्ट करेगा। मुझे यकीन नहीं है कि मुझसे गलती कहां हुई? लेकिन मुझे यह त्रुटि नीचे मिल रही है: मुझे लगता है कि इसका संदर्भ सही नहीं है किसी भी विचार मैं इसे कैसे प्राप्त करूं?।

हैंडल न किया गया अपवाद: नेविगेटर ऑपरेशन एक ऐसे संदर्भ के साथ अनुरोध किया गया जिसमें नेविगेटर शामिल नहीं है। ई/स्पंदन (११५३३): नेविगेटर से मार्गों को पुश या पॉप करने के लिए उपयोग किया जाने वाला संदर्भ उस विजेट का होना चाहिए जो नेविगेटर विजेट का वंशज हो।

यहाँ मेरा कोड है:

import 'package:credit/src/pages/landing.dart';
import 'package:flutter/material.dart';
import 'package:credit/src/pages/credit/home.dart';
import 'package:shared_preferences/shared_preferences.dart';

void main() => runApp(MyApp());

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

  _LoadingPageState createState() => _LoadingPageState();
}

class _LoadingPageState extends State<MyApp> {
  @override
  void initState() {
    super.initState();
    getUserStatus().then((userStatus) {
      if (userStatus == null) {
        Navigator.of(context)
            .push(MaterialPageRoute<Null>(builder: (BuildContext context) {
          return LandingPage();
        }));
      } else {
        Navigator.of(context)
            .push(MaterialPageRoute<Null>(builder: (BuildContext context) {
          return HomePage();
        }));
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return Container(
        child: Center(
      child: CircularProgressIndicator(),
    ));
  }
}

Future<String> getUserStatus() async {
  SharedPreferences prefs = await SharedPreferences.getInstance();
  String userStatus = prefs.getString('userstatus');
  print("==On Load Check ==");
  print(userStatus);
  return userStatus;
}
1
Arun- 28 जुलाई 2019, 15:42

1 उत्तर

सबसे बढ़िया उत्तर

जब आप Navigator.of(context) को कॉल करते हैं तो फ्रेमवर्क प्रदान किए गए context से जुड़े विजेट ट्री में ऊपर जाता है और निकटतम Navigator को खोजने का प्रयास करता है।

आपके द्वारा दिखाए गए विजेट ट्री में एक नहीं है, इसलिए आपको विजेट ट्री में Navigator शामिल करना होगा।
सबसे आसान विकल्प MaterialApp का उपयोग करना है जब आपका विजेट home के रूप में पास हो। MaterialApp अपने अंदर नेविगेटर बना रहा है। (CupertinoApp यह भी करता है)

मूल उदाहरण से अद्यतन कोड:

import 'package:credit/src/pages/landing.dart';
import 'package:flutter/material.dart';
import 'package:credit/src/pages/credit/home.dart';
import 'package:shared_preferences/shared_preferences.dart';

void main() => runApp(MyApp());

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: LoadingPage(),
    );
  }
}

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

  _LoadingPageState createState() => _LoadingPageState();
}

class _LoadingPageState extends State<LoadingPage> { // note type update
  @override
  void initState() {
    super.initState();
    getUserStatus().then((userStatus) {
      if (userStatus == null) {
        Navigator.of(context)
            .push(MaterialPageRoute<Null>(builder: (BuildContext context) {
          return LandingPage();
        }));
      } else {
        Navigator.of(context)
            .push(MaterialPageRoute<Null>(builder: (BuildContext context) {
          return HomePage();
        }));
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return Container(
        child: Center(
      child: CircularProgressIndicator(),
    ));
  }
}

Future<String> getUserStatus() async {
  SharedPreferences prefs = await SharedPreferences.getInstance();
  String userStatus = prefs.getString('userstatus');
  print("==On Load Check ==");
  print(userStatus);
  return userStatus;
}
1
Mikhail Ponkin 28 जुलाई 2019, 18:07