首页 > 解决方案 > Flutter 应用程序中的提供程序不会更改数据

问题描述

我正在 Flutter 上制作一个应用程序并使用 Provider 来选择要显示的屏幕。但是当我改变数据时,屏幕并没有改变。正如我的日志所示,Wrapper 小部件也不会重新生成。这是我的 main.dart 文件:

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:school_app/services/auth_service.dart';
import 'package:school_app/wrapper.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider(
      create: (_) => AuthProvider(),
      child: MaterialApp(
        home: Wrapper(),
      ),
    );
  }
}

还有 wrapper.dart:

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:school_app/screens/authenticate/auth.dart';
import 'package:school_app/screens/school/home.dart';
import 'package:school_app/services/auth_service.dart';

class Wrapper extends StatefulWidget {
  @override
  _WrapperState createState() => _WrapperState();
}

class _WrapperState extends State<Wrapper> {

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    AuthService().auth;
  }

  @override
  Widget build(BuildContext context) {
    return Consumer<AuthProvider>(builder: (context, authProvider, child) {
      print(authProvider.auth);
      if (!authProvider.auth) {
        return Auth();
      } else {
        return Home();
      }
    });
  }
}

还有 AuthService 和 AuthProvider 类:

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

class AuthService {


   /* AuthUser _user(User user) {
    return user != null ? AuthUser(uid: user.uid) : null;
  }*/

AuthProvider auth = new AuthProvider();

  //sign in
  Future signIn(String username, String password) async {
    try {
      SharedPreferences prefs = await SharedPreferences.getInstance();
      var dio = Dio();
      Response user = await dio.post('url', data: {
        'username': username,
        'password': password
      });
      if(user.data['success'] == false) return user.data['msg'];
      await prefs.setString('token', user.data['token']);
      auth.setAuth(true);
      print("SUCCESS");
    } catch(e) {
      print('Error ' + e.toString());
    }
  }

}

class AuthProvider with ChangeNotifier {
  bool _auth;

  AuthProvider() {
    _auth = false;
  }

  bool get auth => _auth;

  void setAuth(bool auth) {
    _auth = auth;
    notifyListeners();
  }
}

请注意,这里有两个类,在 AuthService 中我调用函数 .setAuth(true)。

标签: flutterdart

解决方案


推荐阅读