【问题标题】:Future Builder malfunctioning in flutterFuture Builder 在颤振中出现故障
【发布时间】:2021-02-23 10:13:00
【问题描述】:

我是这样写我未来的建设者的

 FutureBuilder(
        future: Future.delayed(Duration(seconds: 3)),
        builder: (c, s) =>
        s.connectionState != ConnectionState.done
            ? Center(child: CircularProgressIndicator())
            :  nextPage()

虽然工作正常,但它显示了几秒钟的错误,说“类型'Future'不是'Widget'类型的子类型被抛出我的futureBuilder。” 接下来我把它改成

    FutureBuilder(
  future: Future.delayed(Duration(seconds: 3)).then((response) {
    nextPage();    
  }),  
  builder: (context, snapshot) {
    if (snapshot.hasData) {
      return null;
    } else if (snapshot.hasError)
      return Text(snapshot.error.toString());
    return CircularProgressIndicator();
  },
);

但这里的问题是我的 nextpage() 只是闪烁并消失了。

有什么帮助吗?

编辑: 这是我的完整代码,我的要求是前 3 秒的循环进度指示器,然后是 nextpage()。

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(App());
}
class App extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Title',
      home: MyApp(),
    );
  }
}


class MyApp extends StatefulWidget {

  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {









  nextPage() async{

    bool visitedFlag = await getVIsitingFlag();
    setVIsitingFlag();
    if (visitedFlag == true) {
      Navigator.of(context).push(
          MaterialPageRoute(builder: (context) => HomeScreen()));
    }
    else {
      Navigator.of(context).push(
          MaterialPageRoute(builder: (context) => NewScreen()));
    }
  }


@override
  void initState() {
  Future.delayed(Duration(seconds: 3)).then((response) {
    nextPage();
  });
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Color(0xFF311a2e),
      body: SafeArea(
        child:
     CircularProgressIndicator();
    ),
    );
  }
}



 getVIsitingFlag() async{
SharedPreferences preferences = await SharedPreferences.getInstance();
bool alreadyVisited = preferences.getBool('alreadyVisited') ?? false ;
return alreadyVisited;
}

 setVIsitingFlag()async{
  SharedPreferences preferences = await SharedPreferences.getInstance();
preferences.setBool('alreadyVisited', true);
}

【问题讨论】:

    标签: flutter dart flutter-layout flutter-dependencies


    【解决方案1】:

    既然您不想在未来完成时显示任何小部件,只需删除FutureBuilder。只有当你想构建基于你的未来而你不需要的东西时,你才需要它。

    在您的 initState 方法中调用您的方法:

      Future.delayed(Duration(seconds: 3)).then((response) {
        nextPage();    
      }
    

    并构建您的页面,使其看起来像一个进度指示器,而无需 FutureBuilder。

    【讨论】:

    • type 'Future' 不是 'Widget' 类型的子类型,然后我不断得到它。
    • 如果您按照我的回答,这是不可能的。您是否真的删除 FutureBuilder?
    • 是的,我做了,让我用完整的代码编辑我的问题。
    • 您的孩子不是“nextPage”,您的孩子是 CircularProgressIndicator。我告诉你应该把代码放进去的initState方法在哪里?
    • 它不接受 Future.delayed(Duration(seconds: 3).... 初始化状态的方法。
    猜你喜欢
    • 2021-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-19
    • 1970-01-01
    • 1970-01-01
    • 2020-07-04
    相关资源
    最近更新 更多