Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter Flatter中可忽略的页面视图不';我不能正常工作_Flutter_Flutter Layout - Fatal编程技术网

Flutter Flatter中可忽略的页面视图不';我不能正常工作

Flutter Flatter中可忽略的页面视图不';我不能正常工作,flutter,flutter-layout,Flutter,Flutter Layout,我面临一个问题。我有一个flatter应用程序,其中有两个页面(第1页和第2页),第2页被包装成一个Dismissible,所以当我向下拖动时,页面弹出返回到第1页。所有这些都很好,但在第2页我有一个页面视图。在这个页面视图中,当页面索引更改时,我调用一个函数(使用onPageChanged回调),如果在这个函数中,我在一个通知侦听器的提供程序中放置了一个setState或调用了一个函数,那么页面不再更改,但函数仍然被调用。 也许我做错了,但如果你有任何建议或想法来解决它,我将不胜感激 以下是代

我面临一个问题。我有一个flatter应用程序,其中有两个页面(第1页和第2页),第2页被包装成一个Dismissible,所以当我向下拖动时,页面弹出返回到第1页。所有这些都很好,但在第2页我有一个页面视图。在这个页面视图中,当页面索引更改时,我调用一个函数(使用onPageChanged回调),如果在这个函数中,我在一个通知侦听器的提供程序中放置了一个setState或调用了一个函数,那么页面不再更改,但函数仍然被调用。 也许我做错了,但如果你有任何建议或想法来解决它,我将不胜感激

以下是代码snipsets:

main.dart:

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

import './custom_provider.dart';

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

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [ChangeNotifierProvider.value(value: CustomProvider())],
      child: MaterialApp(
        title: 'Flutter Demo',
        theme: ThemeData(
          primarySwatch: Colors.blue,
        ),
        home: FirstScreen(),
      ),
    );
  }
}

class FirstScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Test'),
      ),
      body: Center(
        child: TextButton(
          child: Text('push'),
          onPressed: () {
            showGeneralDialog(
              barrierDismissible: false,
              barrierColor: Colors.transparent,
              transitionDuration: const Duration(milliseconds: 400),
              context: context,
              pageBuilder: (context, anim1, anim2) {
                return SecondScreen();
              },
              transitionBuilder: (context, anim1, anim2, child) {
                return SlideTransition(
                  position: Tween(begin: Offset(0, 1), end: Offset(0, 0))
                      .animate(anim1),
                  child: child,
                );
              },
            );
          },
        ),
      ),
    );
  }
}

class SecondScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final provider = Provider.of<CustomProvider>(context);
    void onPageChanged(int value) async {
      // if (value == 0 && FocusScope.of(context).hasFocus) {
      //   FocusScope.of(context).unfocus();
      // }
      print(value);
      provider.toggleIndexAddScreenPage(value);
    }

    return Dismissible(
      key: UniqueKey(),
      direction: DismissDirection.down,
      onDismissed: (_) {
        Navigator.of(context).pop();
      },
      child: Scaffold(
        appBar: AppBar(
          title: Text('Test'),
        ),
        body: PageView(
          onPageChanged: (value) => onPageChanged(value),
          physics: const BouncingScrollPhysics(),
          children: [
            Container(
              width: double.infinity,
              height: double.infinity,
              color: Colors.pink,
            ),
            Container(
              width: double.infinity,
              height: double.infinity,
              color: Colors.blue,
            ),
          ],
        ),
      ),
    );
  }
}

import 'package:flutter/cupertino.dart';

class CustomProvider extends ChangeNotifier {
  int indexAddScreenPage = 0;

  void toggleIndexAddScreenPage(int value) {
    indexAddScreenPage = value;
    notifyListeners();
  }
}